基础内容就不记了,主要为细节补充内容。
目录
1、标识符问题
(1)以单下划线开头的:(例_foo):代表不能随意访问的类属性,提醒该成员可看作是私有属性,如果真的访问了也不会出错,但不符合规范。
(2)以双下划线开头的:(例__foo):代表类的私有成员。私有成员只能在类的内部进行调用,无法在类的外部直接访问。
(3)以双下划线开头和结尾:(例__foo__):代表python里特殊方法专用的标识。例如__init__()表示类的构造函数,__version__表示所调用包的版本信息。
2、保留字符的查看代码
import keyword
keyword.kwist
3、匿名函数 lambda
匿名函数 lambda 仅由单条语句组成,该语句执行的结果就是返回值。使用匿名函数省略了 def 定义函数的步骤,没有名称属性,所以叫匿名函数。
匿名函数的一般形式如下:
lambda [参数1 [参数2,...,参数n]]:表达式
# 例程:对指定的列表求平方
def universal(list_name,func):
return [func(x) for x in list_name]
a = [1,2,3,4]
b = universal(a,lambda x:x**2)
print(b)
lambda 函数能接收任意数量的参数但是只返回一个表达式的值,不能同时包含命令或多个表达式,调用函数时不占用栈内存从而增加运行效率。
4、递归和闭包
函数内部可以调用其他函数。如果一个函数在内部调用自身,这个函数就是递归函数(recursive function)。递归函数定义简单,逻辑清晰,但其效率不是很高。另外对函数还应该有一个明显的结束或收敛条件。
# 例程:求1+...+n的和
def addn(n):
if n == 1: # 结束条件
return 1
return n+addn(n-1)
# 调用
addn(100)
闭包(closure)是由其他函数生成并返回的函数。即调用一个函数,这个函数返回一个在这个函数中定义的函数。闭包最明显的特征就是被返回的函数可以访问其创建者局部命名空间中的变量,即使其创建者已经执行完毕,闭包仍能继续访问其创建者的局部命名空间。
# 例程
# 闭包执行完后,仍然能保持住当前的运行环境
# 注意书写的缩进和冒号
def counter(name):
c = [0]
def count():
c[0] += 1
if c[0] == 1:print ('This is the','1st','access to',name)
elif c[0] == 2:print ('This is the','2nd','access to',name)
elif c[0] == 3:print ('This is the','3rd','access to',name)
else: print ('This is the',repr(c[0]) + 'th access to',name)
return count
# 测试1
print('This is Test1')
a = counter('example');a();a();a();a()
# 测试2
print('This is Test2')
a = counter('sample');a();a() # 对象a重新赋值后返回初始状态
# 测试3
print('This is Test3')
a = counter('example');a()
其实这里讲的不是很清楚,看完也是迷迷糊糊,贴一个比较好的:
https://www.cnblogs.com/JohnABC/p/4076855.html
5、柯里化与反柯里化
柯里化(currying)是指一个函数在参数传递时返回另一个函数,该返回函数的参数就是原函数没有进行参数传递的参数,柯里化能泛化出很多函数。
其实不是很确定柯里化和反柯里化有什么用,猜测应该就是可以对一个人家已经写好的函数进行利用然后泛化出自己需要的函数吧,想想确实蛮简单的。不用自己费力再写一个少参数或多参数同功能的函数了。
# 函数的柯里化
def power(x,y):
return x**y
# 测试程序
print (power(2,3))
# 将参数y进行柯里化
powerof2 = lambda y:power(2,y) # 柯里化泛化出来的函数为 powerof2
# 测试柯里化之后的函数powerof2
powerof2(5)
# Python 内置 functools 模块的 partial 函数也可以实现柯里化
from functools import partial
powerof_2 = partial(power,2)
powerof_2(5)
反柯里化是将多个只含单个参数的函数模拟成一个多参数函数。
# 反柯里化,其实是闭包的方法
def power(x):
def p(y):
return x**y
return p
power (2) (5)
6、常用的内置高阶函数
高阶函数就是能够接收函数作为参数的函数。
filter(布尔函数,序列) :调用一个布尔函数来遍历序列中的每个元素,返回一个使布尔函数值为true的迭代器。
map(func函数,序列1[,序列2,...]):将指定函数作用于给定序列的每个元素,并返回迭代器。
reduce(func函数,序列[,初始值]):将func函数用于序列的元素,连续将现有结果和下一个元素作用在随后的结果上,最后将简化序列为一个单一的返回值。
函数具体干嘛的就自己用到的时候去找吧。
参考文献
阮敬,《Python数据分析基础》,中国统计出版社,2018年8月