Python相关基础

来源:互联网 发布:阿里云购买云服务器 编辑:程序博客网 时间:2024/06/10 18:53

官方文档:https://docs.python.org/3/

函数Functions:

zip函数

zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表。看示例:

1.示例1:

复制代码
x = [1, 2, 3]y = [4, 5, 6]z = [7, 8, 9]xyz = zip(x, y, z)print xyz
复制代码

运行的结果是:

[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

从这个结果可以看出zip函数的基本运作方式。

2.示例2:

x = [1, 2, 3]y = [4, 5, 6, 7]xy = zip(x, y)print xy

运行的结果是:

[(1, 4), (2, 5), (3, 6)]

从这个结果可以看出zip函数的长度处理方式。

3.示例3:

x = [1, 2, 3]x = zip(x)print x

运行的结果是:

[(1,), (2,), (3,)]

从这个结果可以看出zip函数在只有一个参数时运作的方式。

4.示例4:

x = zip()print x

运行的结果是:

[]

从这个结果可以看出zip函数在没有参数时运作的方式。

5.示例5:

复制代码
x = [1, 2, 3]y = [4, 5, 6]z = [7, 8, 9]xyz = zip(x, y, z)u = zip(*xyz)print u
复制代码

运行的结果是:

[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

一般认为这是一个unzip的过程,它的运行机制是这样的:

在运行zip(*xyz)之前,xyz的值是:[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

那么,zip(*xyz) 等价于 zip((1, 4, 7), (2, 5, 8), (3, 6, 9))

所以,运行结果是:[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

注:在函数调用中使用*list/tuple的方式表示将list/tuple分开,作为位置参数传递给对应函数(前提是对应函数支持不定个数的位置参数)

6.示例6:

x = [1, 2, 3]r = zip(* [x] * 3)print r

运行的结果是:

[(1, 1, 1), (2, 2, 2), (3, 3, 3)]

它的运行机制是这样的:

[x]生成一个列表的列表,它只有一个元素x

[x] * 3生成一个列表的列表,它有3个元素,[x, x, x]

zip(* [x] * 3)的意思就明确了,zip(x, x, x)

yield()函数:

[python] view plain copy
  1. mylist = [x*x for x in range(3)]#生成一个列表,[ 0,1,4]    
  2. print mylist  
  3. mygen=(x*x for x in range(3))  #生成的是一个生成器,generator object <genexpr> at 0x022F8030> 内存地址
  4. print mygen  


注释:这个mygen生成器就是用来生成x的平方的东西。这个结果就存在上面显示的内存地址里。但是由于你还没说你到底要谁的平方,所以只能看到个地址不能看到答案。

[python] view plain copy
  1. mygen=(x*x for x in range(3))  
  2. for i in mygen:  
  3.     print (i)  

这样就可以把mygen可以生成的所有平方数拿出来了。结果显示:

0

1

4

注:当你需要循环读取、而不是一下子全显示出来的时候,用生成器。

---------------------------------------------------------------------------------------------------------------

---"在python中,当你定义一个函数,使用了yield关键字时,这个函数就是一个生成器" 

--- 一般def定义的函数,都会return一个返回值。而def定义的生成器,返回的则是一个对象,也就是上面提到的类似于“内存地址”的东西。

--- 如果需要生成器返回(下一个)值,需要调用.next()函数。其实当系统判断def是生成器时,就会自动支持.next()函数

[python] view plain copy
  1. c = h() #h()包含了yield关键字    
  2. print  c.next() #返回值   

Eg:

[python] view plain copy
  1. def fib(max):  
  2.     a, b = 11  
  3.     while a < max:  
  4.         yield a  
  5.         a, b = b, a+b  
  6. #输出方式1  :
  7. for n in fib(15):  
  8.     print n  
  9. #输出方式2:  
  10. m = fib(13)  
  11. print m  
  12. print m.next()  
  13. print m.next()  
  14. print m.next()  

fib()函数因为含有yield,被系统默认为是一个生成器。

for语句调用了fib(15)。当max=15时,进入fib()生成器,执行到yield a, 返回a值以及整个生成器暂停的状态,将a值赋给n, 打印出来;因为是for语句循环,所以又回到fib(15)语句,由于是生成器,因此从上次截断的位置开始执行,b值赋给a, a+b值赋给b,又因为是while语句,则继续while循环,yield a值,循环暂停跳出返回a值及生成器状态,把a值赋给n, 打印n。如此往复,一直循环到15结束。

m被赋了fib(13)这个生成器,每一次执行m.next()函数就会打印下一个值。

注:

1. 每个生成器只能使用一次。比如上个例子中的m生成器,一旦打印完m的6个值,就没有办法再打印m的值了;

2. yield一般都在def生成器定义中搭配一些循环语句使用,比如for或者while,以防止运行到生成器末尾跳出生成器函数,就不能再yield了。有时为了保证生成器函数永远也不会执行到函数末尾,会用while True: 语句,这样就会保证只要使用next(),这个生成器就会生成一个值,是处理无穷序列的常见方法。


类Class:

原创粉丝点击