python9高级特性

1.迭代
可以通过 for 循环来遍历这个 list tuple,这种遍历我
们称为迭代(Iteration)
只要是可迭代对象,无论有无下标,都可以迭代,比如 dict
就可以迭代:
默认情况下,dict 迭代的是 key。如果要迭代 value,怎么办?
for k,v in d.iteritems():
print k,v
可通过 collections 模块的 Iterable 类型判断是否是迭代对象

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


shopinfo = [
    ('Iphone',1000),
    ('book',200),
    ('fentiao',3500)
]
for i,v in enumerate(shopinfo):
    print i,v

• for
循环里,同时引用了两个变量, Python 里是很常见的;
计算阶乘
def fact(n):
    if not isinstance(n,int):
        print 'input int num'
    if n == 1:
        return 1
    return fact(n-1)*n
print fact(3)
二分法
def fun(n):
    if not isinstance(n,int):
        print 'Error Type'
    print n
    b = int(n/2)
    if b > 0:
        return fun(b)
fun(18)


2.
列表生成式
列表生成式是Python 内置的非常简单却强大的可以用来创建list的生成式
思考:
要生成 list [1, 2, 3, 4, 5, 6, 7] 可以用 range(1, 8)


但如果要生成 [1x1, 2x2, 3x3, ..., 7x7] 怎么做?列表生成式
方法一:for循环
#  [1,2,3,4,5,6,7]      range(1,8)
# [1,4,9,16,25,36,49]
def fun():
    li = []
    for i in range(1,8):
        # print i
        li.append(i*i)
    return li
print fun()


方法二:列表生成式
print [ i*i for i  in range(1,8)]


循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list.
列表生成式可以嵌套if语句和for语句么?
-
生成20以内所有偶数的平方;
print [ i*i for i
  inrange(0,20,2)]
print [ i*i for i
  in range(0,20) if i %2== 0]

-
生成‘ABC’‘123’的全排列;
print [
  i+j for i in '123' for j in'ABC']

列表生成式也可以使用两个变量来生成 list?
-
生成字典的的内容,格式为‘key=value’,返回其列表
格式;
-
list中所有的字符串变为小写字母;
print [i.lower() for i in list if isinstance(i, str)]

3.
生成器
为什么需要生成器?
通过列表生成式,我们可以直接创建一个列表,受到内存限
,列表容量肯定是有限的;
创建一个包含 100 万个元素的列表,占用很大的存储空间;
生成器是什么?
在循环的过程中不断推算出后续的元素呢?这样就不必创
建完整的 list,从而节省大量的空间。在 Python ,这种一
边循环一边计算的机制,称为生成器(Generator)
怎么创建生成器?把一个列表生成式的 [] 改成 ()
使用g.next()方法依次读取元素(麻烦)


使用 for 循环(推荐)




理解生成器的实质,当无法通过列表生成式表述问题
,如何通过函数实现生成式的功能。
python
编程:著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13,21,...
fib
函数定义了斐波拉契数列的推算规
,可以从第一个元素开始,推算出后续
任意的元素,逻辑非常类似 generator
要把 fib 函数变成 generator,只需要
print b 改为 yield b 就可以.


函数顺序执行,return语句或最
后一行函数语句就返回。
•generator
函数在每次调用
next()
的时候执行,遇到 yield
句返回,再次执行时从上次返回的
yield
语句处继续执行。
#
通过yield实现单线程的并发运算
#
异步I/O模型epoll          http  nginx  tomcat

import time
def consumer(name):
    print '%s
准备吃粉条了!' % (name)
    while True:
        fentiao = yield
        print ('
粉条[%s]做出来了,被[%s]吃了') %(fentiao, name)


# g = consumer('
肖遥')
# g.next()
# g.send('
孜然味')

def producer(name):
    c1 = consumer('
肖遥')
    c2 = consumer('
韩窑')
    c1.next()
    c2.next()
    print '
开始制作粉条晚餐了........'
    for i in ['
清蒸','油炸','爆炒']:
        time.sleep(1)
        print '[%s]
做了两份粉条,两个人一块吃' %(name)
        c1.send(i)
        c2.send(i)
producer('
杨佳晨')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值