首页 > 编程语言 > 详细

[python学习笔记]高级特性

时间:2019-06-12 13:40:20      阅读:116      评论:0      收藏:0      [点我收藏+]

迭代iteration

判断一个对象可迭代:

通过for循环来遍历

[root@centos01 python]# cat test.py 
#!/usr/bin/env python
# coding:utf-8
s="hello"
for i in s:
    print i
[root@centos01 python]# python test.py 
h
e
l
l
o
[root@centos01 python]# cat test.py 
#!/usr/bin/env python
# coding:utf-8
s = 1
for i in s:
    print i
[root@centos01 python]# python test.py 
Traceback (most recent call last):
  File "test.py", line 4, in <module>
    for i in s:
TypeError: int object is not iterable

 

通过collections模块的iterable类型判断

In [1]: from collections import Iterable

In [2]: isinstance(abc,Iterable)
Out[2]: True

In [3]: isinstance({"name":"vaon"},Iterable)
Out[3]: True

In [4]: isinstance([123],Iterable)
Out[4]: True

In [5]: isinstance((1,2,3),Iterable)
Out[5]: True

In [6]: isinstance(1,Iterable)
Out[6]: False

 

列表生成式

for循环

输出1-10之间所有整数求平方之后的结果

In [9]: [i**2 for i in range(1,11)]
Out[9]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

 

for循环+if语句

输出1-10之间所有整数求平方,再跟2取余为0的结果

In [11]: [i**2 for i in range(1,11) if (i**2)%2 == 0]
Out[11]: [4, 16, 36, 64, 100]

 

for循环+for循环

输出‘abc‘和‘123‘的全排列

In [12]: [i+j for i in "abc" for j in "123"]
Out[12]: [a1, a2, a3, b1, b2, b3, c1, c2, c3]

 

扩展

列出当前目录下的所有.py文件或目录

#os.listdir(".")表示列出当前目录下所有文件、目录

#i.endswith(".py")判断字符串是否以.py后缀结尾,如果以指定后缀结尾返回True,否则返回False

In [26]: [i for i in os.listdir(".") if i.endswith(".py")]
Out[26]: [check_bool.py, function.py, test.py]

 

练习1

给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输
入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))

#!/usr/bin/env python
# coding:utf-8
shuru=input("输入一个正整数(<=1000):")
def zhishu(num):
    for i in range(2,num):
        if num%i == 0:
            return False
    else:
        return True
 
p=[i for i in range(2,shuru) if zhishu(i)]
 
peidui=[(m,n) for m in p for n in p if m+n == shuru and m <= n]
print len(peidui)

 

生成器Generator

背景

通过列表生成式,可以直接创建一个列表(list):

In [2]: [i for i in range(1,10)]
Out[2]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

 

受到内存限制,列表容量肯定是有限的,例如创建一个包含 100 万个元素的列表,会占用很大的存储空间,创建过程有可能使电脑卡住。

定义

在循环的过程中不断由前一个元素推算出后一个元素,但是后续元素并不立刻生成出来。这样就不必创建完整的 list,从而节省大量的空间。在 Python 中,这种一边循环一边计算的机制,称为生成器(Generator)

使用生成器的方式

1.把一个列表生成式的[]改为()

In [3]: g=(i for i in range(1,10000000))

In [4]: g
Out[4]: <generator object <genexpr> at 0x7f9d83652dc0>

 

调用:

使用.next()

每调用一次显示一个元素

In [5]: g=(i for i in range(1,4))

In [6]: g.next()
Out[6]: 1

In [7]: g.next()
Out[7]: 2

In [8]: g.next()
Out[8]: 3

In [9]: g.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-9-d7e53364a9a7> in <module>()
----> 1 g.next()

StopIteration: 

 

使用for循环

In [10]: g=(i for i in range(1,4))

In [11]: for i in g:
   ....:     print i
   ....:     
1
2
3

 

2.yield用法

如果函数里面有yield关键字,那么调用这个函数的结果赋值给的变量为生成器

当生成器g调用第一个next方法时,会运行函数,直到遇到第一个yield停止

当调用第二个next方法时,会从停止的地方继续执行,直到遇到下一个yield

#!/usr/bin/env python
# coding:utf-8
def fun():
    print "1."          #输出"1."
    yield "第一个yield"  #遇到yield停止,yield后面跟的内容可以在print g.next()时显示出来
    print "2."
    yield "第二个yield"
    print "3."
    yield "第三个yield"
    print "4."
    yield "第四个yield"
 
g = fun()
print g.next()
print g.next()
print g.next()
print g.next()

 

执行结果:

[root@centos01 python]# python test.py
1.
第一个yield
2.
第二个yield
3.
第三个yield
4.
第四个yield

 

练习1:

Fibonacci(斐波纳契)数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21,...,本题要求生成6个数即可

#!/usr/bin/env python
# coding:utf-8
def fib(max):    #max为最终生成fib数列个数
    n,a,b = 0,0,1   #n代表当前fib数列个数,a代表n-1的值,b代表n的值
    while n < max:
        yield b     #当前第一个数列
        a,b = b,a+b
        n += 1
 
g = fib(6)   #变量g就是生成器

for i in g:
    print i

 

输出结果:

[root@centos01 python]# python test.py
1
1
2
3
5
8

3.send用法

使用send方法给生成器函数发送数据

使用send方法前,必须先调用一次next()方法

遇到下一个yield停止

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[python学习笔记]高级特性

原文:https://www.cnblogs.com/vaon/p/11009017.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!