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)
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
•如何判断一个对象是可迭代对象呢?方法是通过 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)
•如果要对 list 实现类似 Java 那样的下标循环怎么办?python内置的枚举方法enumerate,把一个 list 变成索引元素对迭代
shopinfo = [
('Apple',10000),
('Book',200),
('Food',3444)
]
for i,v in enumerate(shopinfo):
• 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
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’的全排列;
- 列出当前目录下的所有文件和目录名;<参考:os.listdir(".")>
In [66]: import os
In [67]: os.listdir('.')
Out[67]:
['.bash_logout',
'.bash_profile',
'.bashrc',
列表生成式也可以使用两个变量来生成 list么?
- 生成字典的的内容,格式为‘key=value’,返回其列表格式;
d = {'name':'hello','age':'5'}
- 将list中所有的字符串变大写字母;
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()
•使用 for 循环(推荐)生成器
In [75]: g = (x for x in range(4))
In [76]: for x in g:
....: print x
....:
0
1
2
•理解生成器的实质,当无法通过列表生成式表述问题时,如何通过函数实现生成式的功能。
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
•函数顺序执行,遇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()
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('老师')

函数式编程:
面对对象编程语言: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('老师')