当前位置:   article > 正文

【python基础学习2】python可迭代对象iterator的特点,以及相关函数:zip(), map(), join() 和strip()方法等

【python基础学习2】python可迭代对象iterator的特点,以及相关函数:zip(), map(), join() 和strip()方法等

 

目录

1 python里的可迭代对象

1.1 什么是可迭代对象

1.2 python里的可迭代对象

1.3 可迭代对象如何遍历

1.3.1 可迭代方法

1.3.2 迭代器的测试

1.4 python里的可迭代对象都不是向量,加法+等是合并规则

1.5  可迭代对象不支持减法操作

1.6 可迭代器可以直接用in判断单个元素的包含操作,但是不能直接判断lsit tuple的包含关系

2 zip()函数:

我愿理解zip()为一个矩阵横向和纵向两种组合方式转化

2.1 zip() 函数定义

2.2 zip()函数的效果

2.3 zip() 函数和 zip(*) 函数

2.4 测试代码

3 map()函数

3.1 map()函数

3.2  测试代码1

3.3 对应iteator, 除了使用map() 函数,用list的闭包形式也可以达到相同效果

4 str.strip() 字符串的strip()方法

4.1 str.strip() 的方法

4.2 奇怪的内容:(原因不明,看起来只有str.strip() 符合要求)

4.3 测试代码

5 join() 函数:  分隔符号.join(iteator) 返回字符串

5.1 基本语法,分隔符号.join(iteator)

5.2 iteator可以是闭包或各种返回为迭代器都可以


1 python里的可迭代对象

1.1 什么是可迭代对象

  • 可循环遍历的就是可迭代的
  • 也就是可以使用for循环遍历它们的对象
  • 写个for循环就可以遍历的这种,python里还可以用list() 遍历更方便
  • 可迭代的:iterable
    • 可迭代的对象: iterable object
    • 迭代器:            iterator

1.2 python里的可迭代对象

  • list
  • tuple
  • string        #字符串天然按其前后次序可迭代
  • dictionary
  • set
  • 也可以自定义可迭代对象

1.3 可迭代对象如何遍历

  • python里对可迭代对象的遍历是很方便的
  • 最简单的遍历方法有如下几种:

1.3.1 可迭代方法

  • 方法1:直接输出迭代器iterator

iterator

#一般只会返回其 object 及其物理地址,而不会返回其 迭代的内容

  • 方法2:直接用print()函数

# print(iterator)

#在jupyter notebook 可以直接输出迭代内容

# 其他IDE不确定?

  • 方法3:使用 for 循环对其进行遍历迭代器iterator:

for x in iterator:

    print(x)

  •  方法4:直接使用list的闭包形式[]:
print([a for a in A2])
  • 方法5:使用 list() 函数,将迭代器转换为一个列表:

list(iterator)

print(list(iterator))

1.3.2 迭代器的测试

  1. A=[1,2,3]
  2. print("\nA=",end="")
  3. A
  4. print("\nprint(A)=",end="")
  5. print(A)
  6. print("\nfor a in A:=",end="")
  7. for a in A:
  8. print(a)
  9. print("\n[a for a in A]=",end="")
  10. print([a for a in A])
  11. print("\nlist(A)=",end="")
  12. print(list(A))

 输出结果

A=
print(A)=[1, 2, 3]

for a in A:=1
2
3

[a for a in A]=[1, 2, 3]

list(A)=[1, 2, 3]

1.4 python里的可迭代对象都不是向量,加法+等是合并规则

  • python里的可迭代对象,包括list=[] 都不是向量,加法+等是合并规则
  • 只有numpy里的 ndarray 对象里的一维数组才是向量计算规则
  1. #python的原生语法,只有list tuple等类型,list也不是向量,都只是可迭代对象
  2. a1="Hello"
  3. b1="World"
  4. a2=[1,2,3]
  5. b2=[4,5,6]
  6. a3=(1,2,3,4)
  7. b3=(5,6,7,8)
  8. print(a1+b1)
  9. print(a2+b2)
  10. print(a3+b3)
  11. #numpy里的array才是向量,矩阵,张量等!计算才是向量规则
  12. import numpy as np
  13. a4=np.array([1,2,3])
  14. b4=np.array([4,5,6])
  15. print(a4+b4)

【OUT】:
HelloWorld
[1, 2, 3, 4, 5, 6]
(1, 2, 3, 4, 5, 6, 7, 8)
[5 7 9]

1.5  可迭代对象不支持减法操作

  • #可迭代器不支持减法操作
  • #TypeError: unsupported operand type(s) for -: 'str' and 'str'
  • #TypeError: unsupported operand type(s) for -: 'list' and 'list'

1.6 可迭代器可以直接用in判断单个元素的包含操作,但是不能直接判断lsit tuple的包含关系

  • #可迭代器可以直接用in判断包含操作,但是要注意只能是单个元素,
  • 不能直接判断lsit tuple的包含关系
  • 如果要判断不同list之间包含关系,估计要写个遍历判断下
  1. #试试减法,in
  2. #python的原生语法,只有list tuple等类型,list也不是向量,都只是可迭代对象
  3. a1="Hello"
  4. b1="llo"
  5. a2=[1,2,3]
  6. b2=3
  7. b20=[3]
  8. b21=[2,3]
  9. a3=(1,2,3,4)
  10. b3=4
  11. b30=(4)
  12. b31=(3,4)
  13. #可迭代器不支持减法操作
  14. #TypeError: unsupported operand type(s) for -: 'str' and 'str'
  15. #TypeError: unsupported operand type(s) for -: 'list' and 'list'
  16. #print(a1-b1)
  17. #print(a2-b2)
  18. #print(a3-b3)
  19. #可迭代器可以直接用in判断包含操作,但是要注意只能是单个元素, 不能直接判断lsit tuple的包含关系
  20. print(b1 in a1)
  21. print()
  22. print(b2 in a2)
  23. print(b20 in a2)
  24. print(b21 in a2)
  25. print()
  26. print(b3 in a3)
  27. print(b30 in a3)
  28. print(b31 in a3)
  29. print()

【OUT】:
True

True
False
False

True
True
False

1.7 iteator,其中list 可用闭包形式实现遍历和函数映射

  • iteator,其中list 可用闭包形式实现遍历和函数映射
  • 闭包形式[]
  • [function(i)  for  i  in list ]
  1. A1=[1,2,3]
  2. print([a for a in A1])
  3. print([a**2 for a in A1])
输出结果
[1, 2, 3]
[1, 4, 9]

2 zip()函数:

我愿理解zip()为一个矩阵横向和纵向两种组合方式转化

2.1 zip() 函数定义

  • zip()函数:我愿理解zip()为一个矩阵横向和纵向两种组合方式转化
  • zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素(index相同)打包成一个个元组,然后返回由这些元组组成的列表。
  • 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
  • zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。

2.2 zip()函数的效果

  • zip()函数的效果:把几个数组,排列后,把index相同的排成新的数组,多余的丢弃
  • 效果相当于 矩阵按行排列,修改为按列去排。

2.3 zip() 函数和 zip(*) 函数

  • 下面两者互为逆运算
  • c=zip(a,b)
  • zip(*c)=a,b

2.4 测试代码

  1. # 可迭代对象:iterable object
  2. # 可迭代对象:list,tuple,string
  3. a=[1,2,3]
  4. b=[4,5,6]
  5. c="abcdefgh"
  6. print(a)
  7. print(zip(a,b))
  8. print(list(zip(a,b)))
  9. print()
  10. print(c)
  11. print(list(c))
  12. print(zip(a,c))
  13. print(list(zip(a,c)))
  14. #可见,在zip()这
  15. #string就等同于list(string),都是可迭代对象
  16. #但是这2个对象,从名称看还是有差别的 25880> 125740>
  17. print(zip(a,list(c)))
  18. print(list(zip(a,list(c))))
  19. print()
  20. zip(*zip(a,b))
  21. print(zip(*zip(a,b)))
  22. print(list(zip(*zip(a,b))))
  23. print(list(zip(*zip(a,c))))

[1, 2, 3]
<zip object at 0x0000022DADAC4B40>
[(1, 4), (2, 5), (3, 6)]

abcdefgh
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
<zip object at 0x0000022DADAC4B40>
[(1, 'a'), (2, 'b'), (3, 'c')]
<zip object at 0x0000022DAE0F3D80>
[(1, 'a'), (2, 'b'), (3, 'c')]

<zip object at 0x0000022DAE0F3D80>
[(1, 2, 3), (4, 5, 6)]
[(1, 2, 3), ('a', 'b', 'c')]

3 map()函数

3.1 map()函数

  • map(function, iterable)
  • map()函数用于将函数映射到可迭代对象中的每个元素可迭代对象中的每个元素
  • 对于可迭代对象中的每个元素应用该函数,函数返回值包含在生成的map对象中。
  • 第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列(列表,元组,集合),返回的是一个集合。即后边的可迭代对象中的每个元素依次作用到函数,并返回输出值构成一个集合。


3.2  测试代码1

  • map(function, iterator)
  • 其中function可以有很多种类型
  1. function=自定义函数
  2. function=匿名函数:
    • map(lambda item: [item[0], item[1], item[1] * TAX], carts)
    • lambda x,y:x*y
  3. function=none:这也可以?
  4. function=系统函数:比如 int
  5. str.strip 
  6. 等等也可以
  • iterator
  1. list
  2. string
  3. tuple
  4. dictionary
  5. ...

  1. #map(function,iterable) 将函数映射到可迭代对象上
  2. #可使用自定义函数
  3. def square(x):
  4. return x**2
  5. a=map(square,[1,2,3])
  6. a
  7. print(a)
  8. print(list(a))
  9. #lambda 匿名函数也行
  10. a=map(lambda x,y:x*y,[1,2],[3,4])
  11. print(list(a))
  12. names = ['david', 'peter', 'jenifer']
  13. new_names = map(lambda name: name.capitalize(), names)
  14. print(list(new_names))
  15. #复杂一点的
  16. carts = [['SmartPhone', 400],
  17. ['Tablet', 450],
  18. ['Laptop', 700]]
  19. TAX = 0.1
  20. carts = map(lambda item: [item[0], item[1], item[1] * TAX], carts)
  21. print(list(carts))
  22. #允许映射到多个可迭代对象
  23. a=map(lambda x,y:(x*y,x+y),[1,2],[3,4])
  24. print(list(a))
  25. #没有函数时,类zip()函数??
  26. a=map(None,[1,2],[3,4])
  27. #print(list(a)) #TypeError: 'NoneType' object is not callable
  28. #对字符串这种对象
  29. string = "Hello World"
  30. result = list(map(str.strip, string))
  31. print(result)
  32. string = "Hello World"
  33. a = map(str.strip, string)
  34. print(list(a))
  35. #对元组
  36. a=map(int,(1,2,3))
  37. print(list(a)) #ValueError: invalid literal for int() with base 10: 'a'
  38. #对字典这种可迭代对象
  39. a=map(int,{'a':1,'b':2,'c':3})
  40. #print(list(a))
  41. #对字典的keys,values的映射
  42. my_dict = {'name': 'Alice', 'age': 25, 'city': 'New York'}
  43. a = map(lambda x: x[0], my_dict.items())
  44. b = map(lambda x: x[-1], my_dict.items())
  45. print(list(a))
  46. print(list(b))
  47. #字典本身的方法也可以做到一样的效果
  48. my_dict = {'name': 'Alice', 'age': 25, 'city': 'New York'}
  49. a=my_dict.keys()
  50. b=my_dict.values()
  51. print(list(a))
  52. print(list(b))

运行结果
<map object at 0x0000022DAF27D240>
[1, 4, 9]
[3, 8]
['David', 'Peter', 'Jenifer']
[['SmartPhone', 400, 40.0], ['Tablet', 450, 45.0], ['Laptop', 700, 70.0]]
[(3, 4), (8, 6)]
['H', 'e', 'l', 'l', 'o', '', 'W', 'o', 'r', 'l', 'd']
['H', 'e', 'l', 'l', 'o', '', 'W', 'o', 'r', 'l', 'd']
[1, 2, 3]
['name', 'age', 'city']
['Alice', 25, 'New York']
['name', 'age', 'city']
['Alice', 25, 'New York']

3.3 对应iteator, 除了使用map() 函数,用list的闭包形式也可以达到相同效果

  1. A1=[1,2,3]
  2. print([a for a in A1])
  3. print([a**2 for a in A1])
输出结果
[1, 2, 3]
[1, 4, 9]

4 str.strip() 字符串的strip()方法

4.1 str.strip() 的方法

  • #错误写法:在python不是独立的函数,   str1=strip(str1)
  • #正确写法:是字符串.方法(),   str1=str1.strip()

  • string.strip()   
  • 方法必须是none 或者是string,不能是数字123这种
  • 不带参数的
  • 删除字符串首尾的指定字符,如果为空则是各种空白/n, /r, /t, ' '等
     

4.2 奇怪的内容:(原因不明,看起来只有str.strip() 符合要求)

  • 下面3种用法,语法上都OK,但是结果不相同
  • string.strip()   
  • str.strip()                     #从结果上看,正确用法
  • str1.strip()   

str1=" hello world "                    #原字符串:13个字的字符串,包含边上2个空格

str2=map(string.strip,str1)        # 返回:13个没有两边空格的字符串,把原字符串映射了n次?

str3=map(str.strip,str1)             # 返回:会分切为13个单个字母,符合一般的需求

str4=map(str1.strip,str1)           # 返回:1个没有两边空格的字符串+12个有两边空格的原字符串,把原字符串映射了n次?

  • str2=map(string.strip,str1)对应结果
    • <map object at 0x0000022DAF288460>
    • ['Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello Worl', 'Hello World']
  • str3=map(str.strip,str1)对应结果
    • <map object at 0x0000022DAF288AF0>
    • ['', 'h', 'e', 'l', 'l', 'o', '', 'w', 'o', 'r', 'l', 'd', '']
  • str4=map(str1.strip,str1)对应结果
    • <map object at 0x0000022DAF28A020>
    • ['hello world', ' hello world ', ' hello world ', ' hello world ', ' hello world ', ' hello world ', 'hello world', ' hello world ', ' hello world ', ' hello world ', ' hello world ', ' hello world ', 'hello world']

4.3 测试代码

  1. # string.strip()
  2. #方法必须是none 或者是string,不能是数字123这种
  3. str1 = "3233121Hello World123456333211"
  4. str1.strip("123") #TypeError: strip arg must be None or str
  5. print(str1.strip("123"))
  6. # 不带参数的
  7. # 删除字符串首尾的指定字符,如果为空则是各种空白/n, /r, /t, ' '等
  8. str1 = " 3233121 Hello World 123456333211"
  9. print(str1.strip())
  10. print()
  11. str1=" hello world "
  12. #错误写法:不是独立的方法, str1=strip(str1)
  13. #正确写法:是字符串.方法(), str1=str1.strip()
  14. #string.strip 这个方法效果匪夷所思
  15. str2=map(string.strip,str1)
  16. str2
  17. print(str2)
  18. print(list(str2))
  19. print()
  20. #str.strip 切成一个个字符
  21. str3=map(str.strip,str1)
  22. str3
  23. print(str3)
  24. print(list(str3))
  25. print()
  26. #str.strip 切成一个个字符
  27. str4=map(str1.strip,str1)
  28. str4
  29. print(str4)
  30. print(list(str4))
  31. print()

输出结果

Hello World123456
3233121  Hello World  123456333211

<map object at 0x0000022DAF288460>
['Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello World', 'Hello Worl', 'Hello World']

<map object at 0x0000022DAF288AF0>
['', 'h', 'e', 'l', 'l', 'o', '', 'w', 'o', 'r', 'l', 'd', '']

<map object at 0x0000022DAF28A020>
['hello world', ' hello world ', ' hello world ', ' hello world ', ' hello world ', ' hello world ', 'hello world', ' hello world ', ' hello world ', ' hello world ', ' hello world ', ' hello world ', 'hello world']

5 join() 函数:  分隔符号.join(iteator) 返回字符串

5.1 基本语法,分隔符号.join(iteator)

  • 分隔符号.join(iteator)
  • 分隔符号
  • iteator,迭代器
  • 返回:字符串
  1. items = ['apple', 'banana', 'orange']
  2. separator = ', '
  3. result = separator.join(items)
  4. print(result)
out: 
apple, banana, orange

5.2 iteator可以是闭包或各种返回为迭代器都可以

  • 分隔符号.join(iteator)
  • iteator,迭代器可以是各种带条件的
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/143167?site
推荐阅读
相关标签
  

闽ICP备14008679号