使用技巧

#!/usr/bin/env python
# coding:utf-8
def fun():
    return "hello"
    print "world"
#在函数里面,遇到return,这个函数执行结束,return之后的语句不再执行,所以这里直接调用函数不会输出结果
fun()
#如果在调用的时候使用print+函数名,表示输出函数的返回值,因此这里会输出返回值“hello”
print fun()


迭代(iteration)

判断一个对象可迭代:

1.可以通过for循环来遍历

Python(八)高级特性_第1张图片

2.通过collections模块的iterable类型判断

Python(八)高级特性_第2张图片

如果要对 list 实现类似 Java 那样的下标循环怎么办:

python内置的枚举方法enumerate,把一个 list 变成索引­元素对

Python(八)高级特性_第3张图片


列表生成式

for循环输出结果(输出1-10之间所有整数求平方之后的结果):

In [41]: [i**2 for i in range(1,11)]
Out[41]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
for循环+if语句(输出1-10之间所有整数求平方,再跟2取余为0的结果):
In [42]: [i**2 for i in range(1,11) if (i**2)%2==0]
Out[42]: [4, 16, 36, 64, 100]
for循环+for循环(输出'abc'和'123'的全排列):
In [46]: [i+j for i in "abc" for j in "123"]
Out[46]: ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']

扩展:

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

In [8]: [i for i in os.listdir(".") if i.endswith(".py")]
Out[8]: ['xuehao.py', 'var_name_rule.py']
#os.listdir(".")表示列出当前目录下所有文件、目录

#i.endswith(".py")表示以.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)

生成器

一、简介

1.背景

通过列表生成式,我们可以直接创建一个列表:

Screenshot from 2017-12-30 17:26:54.png

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

2.定义

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

3.使用生成器的方法

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

>>> g = (i for i in range(1,10000000))
>>> g
at 0x7f13a59d97d0>

调用:

 - 使用.next()每调用一次显示一个元素

Python(八)高级特性_第4张图片

 - 使用for循环

Python(八)高级特性_第5张图片

(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@python code5]# 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就是生成器

print g.next()
print g.next()
print g.next()
print g.next()
print g.next()
print g.next()

(3.)send用法

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

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

遇到下一个yield停止

#!/usr/bin/env python
# coding:utf-8
def fun():
    print "bbbb"
    num1 = yield
    print num1
    num2 = yield
    print num2

g = fun()   #g是生成器

g.next()    #使用send方法前,必须先调用一次next()方法
g.send(1)   #将1发送给变量num1,此时num1=1
g.send(11)  #将11发送给变量num1,此时num1=11

执行结果:

Python(八)高级特性_第6张图片

题目2:

生产者-消费者(producer-consumer)模型,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的 缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者,用于从缓冲区中取出消息。问题出现在当缓冲区已经满了,而此时生产者还想向其中放入 一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费 者还想去取消息,此时也可以让消费者进行休眠,等待生产者放入一个或者多个数据时再唤醒它。

解答:

#!/usr/bin/env python
# coding:utf-8
import time  #调用time内置模块
food = []    #定义一个food列表,模拟包子店的所有包子
def consumer(name):
    print "%s准备买包子" %(name)
    while True:
        baozi_name = yield
        print "客户[%s]买了[%s]馅的包子" %(name,baozi_name)
        food.remove(baozi_name)  #当客户买了这个馅的包子就从列表中删除

def producer(name,*kind):  #*kind表示使用函数中的可变参数
    c1 = consumer("客户1")
    c1.next()
    print "准备制作包子..."
    for i in kind:
        time.sleep(1)  #表示休眠一秒,模拟厨师制作包子过程
        print "厨师[%s]做了[%s]馅包子" %(name,i)
        food.append(i)  #厨师制作了这个馅的包子就在列表中加入
        c1.send(i)

producer("白胡子","牛肉","韭菜","豆沙")

题目3:

简易聊天机器人

解答: