python学习之高级特性

#####高级特性#####
函数式编程:
    面对对象编程语言:java,c++,python
    面对过程编程语言:c
    面对函数编程语言:(lisp,erlang)
0.第归
#1.在写第归函数时要有一个明确的结束条件;
#2.在第归时,问题规模要越来越小;
#3.第归函数效率不高,函数调用时通过栈的数据结构实现的;
#4.每调用一次,栈就会多加一层,最多999层,否则会出现栈溢出;
eg:求阶乘
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)


eg:二分法
def fun(n):
    if not isinstance(n,int):
        print 'Error Type'
    print n
    b = int(n/2)
    if b > 0:
        return fun(b)

fun(14)



1.迭代
•可以通过 for 循环来遍历这个 list 或 tuple,这种遍历我们称为迭代(Iteration)
•只要是可迭代对象,无论有无下标,都可以迭代,比如 dict就可以迭代
•默认情况下,dict 迭代的是 key。如果要迭代 value,怎么办?
In [45]: dic
Out[45]: {'age': '10', 'class': 'math', 'name': 'lee'}

In [46]: for key in dic.keys():
   ....:     print "key=%s" % key
   ....:     
key=age
key=name
key=class

In [47]: for value in dic.values():
   ....:     print "value=%s" % value
   ....:     
value=10
value=lee

value=math




•如何判断一个对象是可迭代对象呢?方法是通过 collections 模块的 Iterable 类型判断迭代
In [48]: from collections import Iterable

In [49]: isinstance('hello',Iterable)
Out[49]: True

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

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

In [52]: isinstance('1',Iterable)
Out[52]: True

In [53]: isinstance({1,2,3},Iterable)
Out[53]: True

In [54]: isinstance({"name":"lee"},Iterable)
Out[54]: True


In [56]: isinstance((1,2,3),Iterable)

Out[56]: True



•如果要对 list 实现类似 Java 那样的下标循环怎么办?python内置的枚举方法enumerate,把一个 list 变成索引­元素对迭代
shopinfo = [
        ('Apple',10000),
        ('Book',200),
        ('Food',3444)
]
for i,v in enumerate(shopinfo):

    print i,v



• for 循环里,同时引用了两个变量,在 Python 里是很常见的;
• 如果要显示[(1,2),(2,3),(3,4)]怎么实现迭代显示?
In [57]: for x,y in [(1,2),(2,3),(3,4)]:
   ....:     print x,y
   ....:     
1 2
2 3

3 4




2.列表生成式
列表生成式是Python 内置的非常简单却强大的可以用来创建 list的生成式
思考:
要生成 list [1, 2, 3, 4, 5, 6] 可以用 range(1, 7)
但如果要生成 [1x1, 2x2, 3x3, ..., 6x6] 怎么做?

方法一:for循环
def fun():
    li = []
    for i in range(1,7):

        li.append(i*i)
    return li
print fun()

方法二:列表生成式
In [61]: [x*x for x in range(1,7)]
Out[61]: [1, 4, 9, 16, 25, 36]

循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的 list.
列表生成式可以嵌套if语句和for语句么?
- 生成100以内所有偶数的平方;
In [65]: [x*x for x in range(0,100,2)]
Out[65]:
[0,
 4,
 16,
 36,
 64,
 100,
 144,

...



- 生成‘ABC’与‘123’的全排列;

print [ i+j for i in '123' for j in 'ABC']




- 列出当前目录下的所有文件和目录名;<参考:os.listdir(".")>
In [66]: import os

In [67]: os.listdir('.')
Out[67]:
['.bash_logout',
 '.bash_profile',
 '.bashrc',

 '.cshrc',




列表生成式也可以使用两个变量来生成 list么?
- 生成字典的的内容,格式为‘key=value’,返回其列表格式;
d = {'name':'hello','age':'5'}

print [ k+'='+v for k,v in d.items()]




- 将list中所有的字符串变大写字母;

print [ i.upper() for i in  li if isinstance(i,str)]




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

In [70]: g.next()
Out[70]: 0

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

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

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

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

StopIteration:





•使用 for 循环(推荐)生成器

In [75]: g = (x for x in range(4))

In [76]: for x in g:
   ....:     print x
   ....:     
0
1
2

3



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

In [78]: fib(5)
1
1
2
3

5





•函数顺序执行,遇return语句或最后一行函数语句就返回。
•generator函数在每次调用next() 的时候执行,遇到 yield 语句返回,再次执行时从上次返回的yield 语句处继续执行。
In [83]: def fib(max):
    n,a,b = 0,0,1
    while n < max:
        yield b
        a,b = b,a + b
        n = n+1
   ....:         

In [84]: fib(3)
Out[84]: <generator object fib at 0x1d8fc30>

In [85]: g = fib(4)

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

In [87]: g.next()

Out[87]: 1







eg
def student(name):
    print '%s 准备答题了' %(name)
    while True:
            a = yield
            print '题[%s] 打印[%s]答完了'%(a,name)
import time
def maker(name):
    s1 = student('学生一')
    s2 = student('学生二')
    s1.next()
    s2.next()
    print '考题打印中。。。。。。'
    for i in range(1,11):
        time.sleep(1)
        print '[%s] 打印了2份考题' % (name)
        s1.send(i)
        s2.send(i)
maker('老师')









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值