Python Learning Note Day 13
PS:明天清明节,一个不是很开心的节日,愿那些离我们而去的人都安好,此生有缘相逢,来世必当再见。
照例,许嵩的《清明雨上》走起。
[music]https://music.163.com/#/song?id=167882[/music]
今天是Python学习第十三天,主要内容是对函数部分的补充,今天内容较少,做了一会儿灰机大战的项目。
补充知识
1.文档字符串
放在函数开头的字符串称为文档字符串(docstring),将作为函数的一部分存储起来。
使用.__doc__方法可以得到文档字符串
def fbnq(number): '生成斐波拉契数列,参数number生成的数列长度' number-=2 lists = [0,1] for i in range(0,number): lists.append(lists[-1] + lists[-2]) return lists ls = fbnq(8) print(ls) # [0, 1, 1, 2, 3, 5, 8, 13] print(fbnq.__doc__) # 生成斐波拉契数列,参数number生成的数列长度
特殊的内置函数help很有用。在交互式解释器中,可使用它获取有关函数的信息,其中包含函数的文档字符串。
D:\python-learning-note>python Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> def fbnq(number): ... '生成斐波拉契数列,参数number生成的数列长度' ... number-=2 ... lists = [0,1] ... for i in range(0,number): ... lists.append(lists[-1] + lists[-2]) ... return lists ... >>> >>> help(fbnq) Help on function fbnq in module __main__: fbnq(number) 生成斐波拉契数列,参数number生成的数列长度 >>>
2. 作用域
有一个名为vars的内置函数,它返回这个不可见的字典。这种“看不见的字典”称为命名空间或作用域(namespace)。
x=2 y=3 dic=vars() print(dic['x'],dic['y']) # 2 3
如果需要,可使用函数globals来访问全局变量。这个函数类似于vars,返回一个包含全局变量的字典。(locals函数返回一个包含局部变量的字典。)
重新关联全局变量
x=2 def change_globals(): global x x+=2 print(x) # 2 change_globals() print(x) # 4
3. 闭包
def multiplier(factor): def multiplyByFactor(number): return number * factor return multiplyByFactor doulbe=multiplier(5) print(doulbe(3))# 15
在这里,一个函数位于另一个函数中,且外面的函数返回里面的函数。也就是返回一个函数,而不是调用它。重要的是,返回的函数能够访问其定义所在的作用域。换而言之,它携带着自己所在的环境(和相关的局部变量)!每当外部函数被调用时,都将重新定义内部的函数,而变量factor的值也可能不同。由于Python的嵌套作用域,可在内部函数中访问这个来自外部局部作用域(multiplier)的变量,这样存储其所在作用域的函数称为闭包。
通常,不能给外部作用域内的变量赋值,但如果一定要这样做,可使用关键字nonlocal。 这个关键字的用法与global很像,让你能够给外部作用域(非全局作用域)内的变量赋值。
4. 递归
简单点说就是自己调用自己,最好的两个例子就是阶乘和幂。
阶乘:
不用递归可以这样来实现:
def factorial(n): result = n for i in range(1,n): result *= i return result print(factorial(3)) # 6
而使用递归之后的代码是这样的:
def digui_fac(n): if n == 1: return 1 else: return n * digui_fac(n - 1) print(digui_fac(3)) # 6
分析下,函数需要一个参数(即你要求阶乘的数),如果等于1,函数直接返回1(1的阶乘等于1),如果不等于1,调用自己,并且将n-1传给自己,在进行判断计算,直到最后n=1了从里向外计算,最终得到结果。 我的理解就是一个先钻进去,在钻出来的过程,所以递归一定会有一个结束递归的条件,这个程序中条件就是n==1的时候。
幂:
def pows(x,n): if n == 0: return 1 else: return x * pows(x,n-1) print(pows(123,0)) # 1 print(pows(2,3)) # 8
5. lambda表达式
lambda表达式让你能够创建内嵌的简单函数(主要供map、filter和reduce使用)。
seq = ['34','kiwi','kiwi123','###','@#$Y12'] re = filter(lambda x: x.isalnum(), seq) for item in re: print(item) # 34 # kiwi # kiwi123 # isalnum判断字符串是否是由数字字母组成
6. 小结
本章介绍了抽象的基本知识以及函数。
抽象:抽象是隐藏不必要细节的艺术。通过定义处理细节的函数,可让程序更抽象。
函数定义:函数是使用def语句定义的。函数由语句块组成,它们从外部接受值(参数),并可能返回一个或多个值(计算结果)。
参数:函数通过参数(调用函数时被设置的变量)接收所需的信息。在Python中,参数有两类:位置参数和关键字参数。通过给参数指定默认值,可使其变成可选的。
作用域:变量存储在作用域(也叫命名空间)中。在Python中,作用域分两大类:全局作用域和局部作用域。作用域可以嵌套。
递归:函数可调用自身,这称为递归。可使用递归完成的任何任务都可使用循环来完成,但有时使用递归函数的可读性更高。
函数式编程:Python提供了一些函数式编程工具,其中包括lambda表达式以及函数map、filter和reduce。
7. 新函数
函数 | 描述 |
---|---|
map(func, seq[, seq, ...]) | 对序列中的所有元素执行函数 |
filter(func, seq) | 返回一个列表,其中包含对其执行函数时结果为真的所有元素 |
reduce(func, seq[, initial]) | 等价于 func(func(func(seq[0], seq[1]), seq[2]), ...) |
sum(seq) | 返回 seq 中所有元素的和 |
apply(func[, args[, kwargs]]) ) | 调用函数(还提供要传递给函数的参数 |
版权声明:
作者:Kiwi
链接:https://www.qingwei.tech/programe-develops/929.html
来源:清渭技术小站
文章版权归作者所有,未经允许请勿转载。
网友
加油,我也在学习