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。即索引012

 

如果第一个索引是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

dictitems()可以同时迭代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可以传两个变量,因此列表生成式也可以使用两个变量:(dictitems()可以同时迭代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]

posted @ 2018-09-03 14:19  幸福在今天  阅读(144)  评论(0)    收藏  举报