python 学习笔记3
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 学习笔记3相关的知识,希望对你有一定的参考价值。
9 高阶函数
(1) map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。list(map(str, [1, 2, 3]))
(2) reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。from functools import reduce
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
(3) filter()也接收一个函数和一个序列。filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。filter()
函数返回的是一个Iterator
.
(4) sorted()排序sorted([‘bob‘, ‘about‘, ‘Zoo‘, ‘Credit‘], key=str.lower, reverse=True)
10 函数式编程
(1) 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
调用lazy_sum()
返回函数,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,称为闭包。
返回的函数并没有立刻执行,f=lazy_sum(1,2,3) 调用了 f()函数才执行。
返回函数不要引用任何循环变量,或者后续会发生变化的变量。
如果一定要引用循环变量,方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变。
def lazy_sum(*args):
def sum():
ax=0
for n in args:
ax=ax+n
return ax
return sum
(2) 匿名函数, 关键字lambda表示匿名函数,冒号前面的x表示函数参数, 冒号后面是表达式。lambda x: x * x
(3) 装饰器
(4) 偏函数,当函数的参数个数太多,需要简化时,使用functools.partial
可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
11 模块
每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。
__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块。
类似__xxx__
这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__
就是特殊变量。
类似_xxx
和__xxx
这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc
等;
12 类
(1)由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。
通过定义一个特殊的__init__
方法。__init__
方法的第一个参数永远是self,表示创建的实例本身,
因此,在__init__
方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;
和静态语言不同,Python允许对实例变量绑定任何属性如bart.age
。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print(‘%s: %s‘ % (self.name, self.score))
bart = Student(‘Bart Simpson‘, 59)
bart.age=12
(2)如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__
,
在Python中,实例的变量名如果以__
开头,就变成了一个私有变量(private)self.__name=name
,外部代码要获取name, 可以给Student类增加方法.
(3)继承可以把父类的所有功能都直接拿过来,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
(4)isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。isinstance([1, 2, 3], (list, tuple)
;
dir()函数获得一个对象的所有属性方法;
getattr()、setattr()以及hasattr(),可以直接操作一个对象的属性或方法;getattr(obj, ‘z‘, 404) # 获取属性‘z‘,如果不存在,返回默认值404
(5)类属性,直接在class中定义属性。相同名称的实例属性将屏蔽掉类属性。
(6)给实例绑定一个方法,
s = Student()
def qage(self,age):
self.age=age
from types import MethodType
s.age=MethodType(qage,s)
s.age(9)
给类绑定方法,给class绑定方法后,所有实例均可调用 Student.qage=qage
想要限制实例的属性, 在定义class的时候,定义一个特殊的__slots__
变量,来限制该class实例能添加的属性. class Student(object):
__slots__ = (‘name‘, ‘age‘) # 用tuple定义允许绑定的属性名称
_slots__
定义的属性仅对当前类实例起作用,对继承的子类是不起作用的, 除非在子类中也定义_slots__
这样,子类实例允许定义的属性就是自身的_slots__
加上父类的`slots_。
(7)Python内置的@property装饰器就是负责把一个方法变成属性调用的。
class Student(object):
@property
def age(self):
return self.__age
@age.setter
def age(self,value):
if not isinstance(value,int):
raise ValueError(‘wrong‘)
self.__age=value
(8)__str__:
print出实例,不但好看,而且容易看出实例内部重要的数据。 直接显示变量调用的不是__str__()
而是__repr__()
两者的区别是__str__()
返回用户看到的字符串,而__repr__()
返回程序开发者看到的字符串,也就是说__repr__()
是为调试服务的。__repr__()
定义后可直接显示。
class a(object):
def __init__(self,name):
self.__name=name
def __str__(self):
return ‘hello %s‘%self.__name
__repr__=__str__
以上是关于python 学习笔记3的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段