python基础语法(11 12 迭代 生成式等)
目录:
11.切片
12.迭代
13.列表生成式
生成器 使用时再学习
14.迭代器
15.函数式编程
16.map和reduce函数
--------------------------------------------------------------
11.切片
针对list\tuple\string提供的类似截取函数,,Python没有针对字符串的截取函数,只需要切片一个操作完成。
有了切片操作,很多地方循环就不再需要了,一行代码就可以实现很多循环才能完成的操作。
没有接触切片之前,取一个list或tuple的部分元素的操作是:
|
>>> L=[1,2,'23','de'] >>> L[0],L[1],L[2] (1, 2, '23') >>> #或如下方式: ... >>> n=0 >>> while n<3: ... print(L[n]) ... n=n+1 ... 1 2 23 |
对这种经常取指定索引范围的操作,用循环十分繁琐,使用切片后:
>>> L[0:3]
[1, 2, '23']
L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2。
如果第一个索引是0,还可以省略:
>>> L[:3]
[1, 2, '23']
可以从索引1开始,取出2个元素出来
>>> L[1:3]
[2, '23']
既然Python支持L[-1]取倒数第一个元素,那么它同样支持倒数切片:
>>> L[-2:]
['23', 'de']
取后3个元素:
>>> L[-3:]
[2, '23', 'de']
取第2-4个数:
>>> L[2:4]
['23', 'de']
每两个取一个:
>>> L[:4:2]
[1, '23']
所有数,每2个取一个:
>>> L[::2]
[1, '23']
甚至什么都不写,只写[:]就可以原样复制一个list
>>> L[:]
[1, 2, '23', 'de']
Tuple也是一种list,唯一区别是tuple不可变,用切片操作后,结果仍是tuple:
>>> (2,4,56,7,'ty','erwr',244)[:4]
(2, 4, 56, 7)
字符串’xxx’也可以看成是一种list,每一个字符就是一个元素,用切片操作后,仍是字符串:
>>> 'qiwxedcrfvrrit'[-6:]
'fvrrit'
12.迭代
如果给定一个list或tuple,我们可以通过for……in循环来遍历,它们有自己的索引值(下标)。其他数据类型是没有下标,只要是可迭代对象,无论有无下标,都可以迭代:
如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:
>>> from collections import Iterable
>>> isinstence('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False
使用内建的isinstance函数可以判断一个变量是不是字符串:
>>> x = 'abc'
>>> y = 123
>>> isinstance(x, str)
True
>>> isinstance(y, str)
False
>>> for a in 'ABCD':
... print(a)
...
A
B
C
D
|
>>> for key in d: ... print(key,' ',d[key]) ... b 2 c 3 a 1 |
最后一个小问题,如果要实现要按下标循环,可用内置的enumerate()函数,把一个list变成索引—元素对,这样就可以在for循环中同时迭代索引和元素本身:
>>> for i,value in enumerate('ABCD'):
... print(i,' ',value)
...
0 A
1 B
2 C
3 D
for循环中,同时引用两个变量,在Python中很常见:
>>> for x,y in [(1,3),('r','e'),(6,7)]:
... print(x,y)
...
1 3
r e
6 7
dict的items()可以同时迭代key和value:
>>> d={'name':'wei','s':'male','age':34}
>>> for key,v in d.items():
... print(key,' = ',v)
...
name = wei
s = male
age = 34
13.列表生成式
range([start,]stop[,step]),可以生成一个整数数列
>>> list(range(8))
[0, 1, 2, 3, 4, 5, 6, 7]
但要生成[1x1, 2x2, 3x3, ..., 10x10]怎么破,用循环,可以有:
>>> from collections import Iterable
>>> isinstance(range(1,10),Iterable)
True
>>> L=[]
>>> for i in range(1,11):
... L.append(i**2)
...
>>> print(L)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
但循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:
>>> [x**2 for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
写列表生成时,要把x**2放到前面,后面跟for循环,就可以把list创建出来。
列表生成式中,还可加if判断,可以筛选出仅偶数的平方:
>>> [x**2 for x in range(1,11) if x%2==0]
[4, 16, 36, 64, 100]
还可以使用两层循环,生成排列:
>>> [m+n for m in 'ABCDEF' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ', 'DX', 'DY', 'DZ', 'EX', 'EY', 'EZ', 'FX', 'FY', 'FZ']
上面的两层循环,和下面的写法,效果是一样的:
>>> for m in 'ABCDEF':
... for n in 'XYZ':
... print(m+n)
三层和三层以上的循环就很少用到了。
运用列表生成式可以写出很简洁的代码,例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:
>>> [d for d in os.listdir('F:\python_script')]
['new.py', '__pycache__']
for可以传两个变量,因此列表生成式也可以使用两个变量:(dict的items()可以同时迭代key和value:)
>>> d={'name':'wei','s':'male','age':34}
>>> [key+'='+str(v) for key,v in d.items()]
['name=wei', 's=male', 'age=34']
应用:将list中所有字符转换为小写:
>>> L=['sewe','weTRwe','dweRTsd']
>>> [a.lower() for a in L]
['sewe', 'wetrwe', 'dwertsd']
但列表有数字时,要报错:
|
>>> L=['sewe','weTRwe',4,'dweRTsd'] >>> [a.lower() for a in L] Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <listcomp> AttributeError: 'int' object has no attribute 'lower' |
怎么处理呢?
>>> L=['sewe','weTRwe',4,'dweRTsd']
>>> [a.lower() for a in L if isinstance(a,str)]
['sewe', 'wetrwe', 'dwertsd']
14.迭代器
可直接用于for循环的数据类型有以下几种:
一类是集合数据类型,如list tuple dict set str等。一类是generator,包括生成器和带yield的generator function。
这些可直接作用于for循环的对象统称为可迭代对象:Iterable. 可以用isinstance()判断一个对象是否为Iterable对象。
>>> type('222')
<class 'str'>
>>> isinstance('2233',str)
True
PS. isinstance(xx, type) 函数用来判断一个对象是否为指定的类型。
>>> from collections import Iterable
>>> isinstance([],Iterable)
True
可作用于next()函数的对象都是Iterator类型(迭代器),它们表示一个惰性计算的序列;集合数据类型如list dict str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
15.函数式编程
函数名也是变量
>>> f=abs
>>> f(-11)
11
既然函数是变量,那么一个函数就可以接受另一个函数作为参数,这种函数就称之为高阶函数。
>>> def add (x,y,f):
return f(x)+f(y)
>>> f=abs
>>> add(-2,-32,f)
34
16.map和reduce函数
map()函数接收两个参数,一个是函数,一个Iterable,map将传入的函数一次作用到序列的每个元素上,并将函数的结果作为Iterator的元素,map()函数返回该Iterator。
>>> help(map)
Help on class map in module builtins:
class map(object)
| map(func, *iterables) --> map object
|
| Make an iterator that computes the function using arguments from
| each of the iterables. Stops when the shortest iterable is exhausted.
|
| Methods defined here:
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
|
| __iter__(self, /)
| Implement iter(self).
|
| __new__(*args, **kwargs) from builtins.type
| Create and return a new object. See help(type) for accurate signature.
|
| __next__(self, /)
| Implement next(self).
|
| __reduce__(...)
| Return state information for pickling.
----------------------------------------------------------
>>> def f(x):
return x*x
>>> tempIterator=map(f,[3,43,65,23])
>>> print(list(tempIterator))
[9, 1849, 4225, 529]

浙公网安备 33010602011771号