############python 高阶函数
可以接受函数作为参数的函数
def add(x,y,f):
return f(x)+f(y)
由于参数想,x,y和f都可以任意传入,如果f传入其他函数,就可以得到不同的返回值
############map()函数
它接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上,得到一个新的list并返回
由于list包含的元素可以是任何类型,因此,map()也可以处理包含任意类型的list
注意:map()函数不会改变原有的list,而是返回一个新的list
############reduce()函数
reduce()传入的函数f必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果。
###########filter()
filter()函数接收一个函数f和一个list,这个函数f的作用是对每个元素进行判断,返回true和false,
filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件组成的新list
#############自定义排序函数
sorted()也是一个高阶函数,他可以接收一个比较函数来实现自定义排序
#############匿名函数
lambda x:x*x
关键字lambda表示匿名函数,冒号前面的x表示函数的参数
匿名函数有个限制,就是只能有一个表达式,不能写return,返回值就是该表达式的结果
###############函数作用域的LEGB
L:local函数内部的作用域
E:enclosing函数内部与内嵌函数之间
G:global全局作用域
B:build-in内置作用域
############闭包
内层函数引用了外层函数的变量,然后返回内层函数的情况
###########传入参数
def set_passline(passline):
def cmp(val):
if val>=passline:
print('pass')
else:
print('failed')
return cmp
f_100=set_passline(60)
print(type(f_100))
>>><type 'function'>
print(f_100.__closure__)
>>>(<cell at 0x0000000002B004F8: int object at 0x000000000206DF58>,)
f_100(89)
>>>pass
f_100(59)
>>>failed
###################传入函数
def my_sum(*arg):
return sum(arg)
def my_average(*arg):
return sum(arg)/len(arg)
def dec(func):
def in_dec(*arg):
if len(arg)==0:
return 0
for val in arg:
if not isinstance(val,int):
return 0
return func(*arg)
return in_dec
my_sum=dec(my_sum)
print(my_sum(1,2,3,4,5))
print(my_sum(1,2,3,4,5,'6'))
#####装饰器(对闭包的使用)
@decorator可以极大的简化代码,避免每个函数编写重复性代码
1.装饰器用来装饰函数
2.返回一个函数对象
3.被装饰函数标识符指向返回的函数对象
4.语法糖@deco
decorator本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数
python提供@语法,这样可以避免手动编写f=decorator(f)
def dec(func):
def in_dec(*arg):
if len(arg)==0:
return 0
for val in arg:
if not isinstance(val,int):
return 0
return func(*arg)
return in_dec
@dec
def my_sum(*arg):
return sum(arg)
def my_average(*arg):
return sum(arg)/len(arg)
##my_sum=dec(my_sum)
print(my_sum(1,2,3,4,5))
print(my_sum(1,2,3,4,5,'6'))
###############完善装饰器
@functools
decorator还改变了函数的__doc__等其它属性。如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数
########偏函数
functools.partial可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值
####模块和包
包/模块
包就是文件夹,包可以有多级,包下面必须要有__init__.py文件(和单纯文件夹的区别)
模块就是py文件
要使用一个模块,我们就必须先导入该模块,使用import,之后可以访问模块中定义的所有公开的函数,变量,类
如果我们只希望导入用到的math模块的某几个函数,而不是所有函数,from math import pow, sin, log这样可以直接引用函数,不用加前缀
但是,如果使用 from...import 导入 log 函数,势必引起冲突。这时,可以给函数起个“别名”来避免冲突
######动态导入模块
try:
import json
except ImportError:
import simplejson
print json.dumps({'python':2.7})
##########安装第三方模块
1.easy_install
2.pip install(推荐)
##########面向对象
类是模板,实例是根据类创建的对象
1.类:类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。
2.实例:创建实例使用类名+()的形式。
####__init__()方法
创建类的时候就给实例加上属性
__init__() 方法的第一个参数必须是 self,后续参数则可以自由指定,和定义函数没有任何区别。
setattr()设置属性
iteritems()获取字典的key,value
class Person(object):
def __init__(self,name,gender,birth,**kw):
self.name=name
self.gender=gender
self.birth=birth
for k,v in kw.iteritems():
setattr(self,k,v)
xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
#####访问限制
属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问
如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,
有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。
以单下划线开头的属性"_xxx"虽然也可以被外部访问,
但是,按照习惯,他们不应该被外部访问。
#############类的属性
类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!
也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。
当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。
######类的继承(复用已有的代码)
一定要用 super(classname, self).__init__( , ) 去初始化父类
注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)。
#########判断类型
函数isinstance()可以判断一个变量的类型,
既可以用在Python内置的数据类型如str、list、dict,
也可以用在我们自定义的类,它们本质上都是数据类型。
###########多重继承
多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。
##########获取对象信息
type()获取变量类型
dir()获取变量的所有属性
getattr()获取对象的某个属性
setattr()设置对象属性
##############特殊方法(magic method)
__str__
__cmp__
__len__
__slots__ __slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。
一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。