Python 学习---------Day5

第十四章 文档
class employee:
"class doumentation"
pass
print employee.__doc__
#注释会保存在__doc__属性中以供查看.

import sys
print sys.__doc__
print int.__doc__

第十五章 函数基础
def 是可执行的代码
def创建了一个对象并将其赋值给某一变量名
return将一个结果对象发送给调用者
函数是通过赋值(对象引用)传递的
global申明了一个模块的变量并被赋值
参数,返回值以及变量并不是声明
def intersect(seq1,seq2):
res=[]
for x in seq1:
if x inseq2:
res.append(x)
return res
第十六章 作用域和参数
一个在def内定义的变量名能够被def内的代码使用,不能在函数的外部引用这样的变量名
def之中的变量名与def之外的变量名并不发生冲突,即使是使用在别处的相同的变量名,一个在def之外被赋值(例如在另外一个def之中或者在模块文件的顶
层)的变量x与在这个def之中的变量x是完全不同的变量
函数定义了本地作用域,而模块定义的是全局作用域.
内嵌的模块是全局作用域:每一个模块都是一个全局作用域,对于外部的全局变量变成一个模块对象的属性,但是在一个模块中能够像简单的变量一样使用
变量名引用分为三个作用域进行查找,首先是本地,之后是函数内,之后是全局,最后是内置
在默认的情况下,变量名赋值会创建或者改变本地变量
全局声明将赋值变量名映射到模块文件内部的作用域

作用域与带有循环变量的默认参数相比较
def make():
acts=[]
for i in range(5):
acts.append(lambda x:i**x)
return acts
acts[0](2) 4
acts[2](2) 4
这里的原因是i对于每一个列表中的函数都是相同的值4
这是嵌套作用域的值和默认参数方面遗留的一种需要解释清楚的情况,而不是引用所在的嵌套作用域的值
为了能让这类代码可以工作,必须使用默认参数把当前的值传递给嵌套作用域的变量
因为默认参数是在嵌套函数创建时候评估的,而不是在其稍后它调用时
def make():
acts=[]
for i in range(5):
acts.append(lambda x,i=i:i**x)
return acts
不可变参数是通过值进行传递
可变对象是通过指针进行传递
def change(a,b):
a=1
b[0]='spam'

x=1
L=[1,2]
change(x,L)
x=1
L={'spam',2]
避免可变参数的修改
L=[1,2]
change(x,L[:])

def change(a,b):
b=b[:]
a=2
b[0]='spam'
任意参数的实例
def f(*arg):
print arg
def f(**arg):
print arg
f() {}
f(a=1,b=2) {'a':1,'b':2}
def f(a,*pargs,**kargs):
print a,pargs,kargs

def min(*args):
res=args[0]
for i in args[1:]:
if res<args[i]
res=args[i]
return res

def min(first,*rest):
for arg in rest:
if first<arg:
first=arg
return first

def min(*args):
tmp=list(args)
tmp.sort()
return tmp[0]
第十七章 函数的高级话题
匿名函数:lambda
lambda是一个表达式,而不是一个语句
lambda的主体是一个单个的表达式,而不是一个代码块
def fun(x,y):
return x+y
fun(2,4,5)

f=lambda x,y,z:z=x+y
f(2,3,4)

x=(lambda a='fee',b='fie',c='d':a+b+c)
x("wee")

def knights():
title='sir'
action=(lambda x:title+' '+x)
return action
act=knights()
act('ad')

内置函数apply
def fun(x,y,z):
return x+y+z
apply(fun,(2,3,4))
f=lambda x,y,z:x+y+z
apply(f,(2,3,4))
在序列中映射函数 map
count=[1,2,3,4]
a=[]
for x in count:
a.append(x+10)

def inc(x):x+10
map(inc,count)
map((lambda x:x+10),count)
函数式编程工具:filter和reduce
range(-5,5)
filter((lambda x:x>0),range(-5,5))

列表解析
res=[ord(x) for x in 'spam']
[x**2 for x in range(10)]
map((lambda x:x**2),range(10))
[x for x in range(5) if x%2==0]

重访迭代器:生长器
def gen(n):
for i in range(n):
yield i**2
x=gen(4)
x.next()
x.next()
生成器表达式:迭代器遇到列表解析
[x**2 for x in range(4)]
(x**2 for x in range(4)) //返回迭代对象,使用next()获取

原文地址:https://www.cnblogs.com/SqLver/p/4941773.html