1。全局变量和局部变量 一般定义在程序开头的变量称为函数变量,定义在子程序中的变量称为局部变量,可以简单理解为没有缩进的全局变量和有缩进的局部变量缩进。全局变量的作用域是整个程序,而局部变量的作用域是子程序内部。程序运行时,首先会查找程序中是否有局部变量,有则调用,没有则调用全局变量。如下:[AppleScript]纯文本查看`(`)运行结果:czp`1 调用func()函数,程序会先查找函数内部是否有name变量,如果有就是,它会调用名字的值,如果没有定义为局部变量,函数会去寻找全局名字。`复制代码 可以使用global关键字通过局部变量修改全局变量,如下图:():`globalname` 函数内部使用global关键字通过局部变量修改全局变量的值`name`=`"czp1"print`(name)`func`() print局部变量中name的值`print`(name) 打印全局变量中name的值。运行结果:czp`1`czp`1 从运行结果可以明显看出,通过global`,在定义局部变量的同时,也修改了全局变量的值复制代码 之间的区别global和nonlocal: python引用变量的顺序:当前作用域局部变量->外部作用域变量->当前模块全局变量->python内置变量 global关键字用于在函数或函数中使用全局变量局部作用域,通过glabal关键字修改局部作用域中的全局变量(一般不推荐) nonlocal关键字用于在函数或局部作用域中使用外部(非全局)变量。2.一个递归函数 在一个函数内部,可以调用其他函数。如果某个函数调用的函数还是它自己,这个函数就可以称为递归函数。[AppleScript]纯文本视图__复制代码?01020304050607080910111213复制代码defcalc`(n)`:print`(n)`ifint`(n/2)==0:`returnnreturncalc`(int(n/2)) 在calc函数中,反复调用calc本身,这样的函数就是递归函数`calc`(10)`运行结果:10521复制代码 注意:在递归函数中,不可能让自己一直循环下去,一个清晰结束条件必须在递归函数中定义。每次执行更深的递归时,与上一层相比,要解决的问题的规模必须减小。 递归函数常用于二分查找。.3.匿名函数 匿名函数其实就是不需要指定和显示的函数。用lambda关键字定义,通常我们定义一个函数是这样的形式:[AppleScript]Viewinplaintext__Copycode?12345defcalc`(x)`:returnx`+`1print`(calc(2)`)runResult:3 如果上面的代码使用了匿名函数,可以使用下面的方法传入一个形式参数x通过lambda关键字,用冒号分隔,然后加上返回值。[AppleScript]以纯文本查看__复制代码?1234res`=lambdax:x+`1print`(res(2)`)运行结果:3 单独使用匿名函数是没有意义的,但是和其他函数一起使用时,函数显示的时候就很明显了。比如下面这个例子[AppleScript]纯文本视图(i)`运行结果:41636复制代码 接下来我会在写内置方法的时候详细展示使用匿名函数的好处。4.高阶函数 高阶函数的特点如下:1)函数接收的参数是一个函数;2)函数的返回值是一个函数作为另一个函数的参数deffoo`(n)`:print`(n)`defbar`(name)`:print`("mynameis%s"%name)`print`(foo(bar("NicholasZhaoSi")))`运行结果:我叫NicholasZhaoSiNoneNone 返回两个None,因为我没有在foo()和bar()功能。默认返回无复制代码[AppleScript]纯文本视图__复制代码?010203040506070809101112复制代码使用一个函数作为另一个函数的返回值defbar`():`print`("frombar")`deffoo`():`print`("fromfoo")`returnbarfoo`()(`)运行结果:fromfoofrombar复制代码4.内建函数 首先介绍3个比较重要和常用的内建函数,map;reduce,filter3个内置函数 1.map: 将函数应用于seq中的每个元素,并将所有调用的结果作为列表返回。 模拟这个需求:有一个列表[1,2,3,4],我想把列表中的每个元素都加1,然后打印出来,这个程序可以这样写:[AppleScript]纯文本查看__复制代码?0102030405060708091011复制代码name`=[1,2,3,4`] res`=`[] 定义一个空列表接收自增defcalc`(数组)后的值`:foriinarray`: 使用for`循环遍历传入列表中的每个元素res.append`(i+1)`returnresprint`(calc(name)`)runresult:[`2,``3,4,``5]`复制代码 那么如果我想要的是让list减1然后自乘,我是不是应该重复这段代码,就把这句res.append(i-1),或者更高级一点,我们在定义一个函数:[AppleScript]plaintextview__copycode?01020304050607080910111213copycodedefincrease`(x)`:returnx`-1 定义一个减1的函数`name`=[1,2,3,4`]res`=`[]defcalc`(func,array): 这里定义两个形参,一个是用来传入the函数increase,其中一个用于传入列表`nameforiinarray`:`res.append`(increase(i)`)returnresprint`(calc(increase,name)`)运行结果:[`0,``1,2,``3]`复制代码 更高级的东西怎么样?我们使用上面提到的map+匿名函数,可以很好的满足这样的需求:[AppleScript]Viewinplaintext__copycode?1234name`=[1,2,3,4`]print`(list(map(lambdax:x+1,name)))`运行结果:[`2,3,4,5`] ok,上面写了这么多,就两行代码。 2.reduce: reduce()函数接收的参数和map()类似,一个函数f和一个list,但是行为不同于map(),reduce()中传入的函数f必须接收两个参数,reduce()为列表的每个元素重复调用函数f,并返回最终结果值。可以简单理解为map接受一个列表,返回一个列表,而reduce会进行计算,返回一个值[AppleScript]plaintextview__复制代码?12345fromfunctoolsimportreduce必须导入reduce方法名`=[1,2,3,4`]print`((reduce(lambdax,y:x+y,name))) 函数必须传入两个参数,然后传入list。`运行结果:10 reduce还有一个默认参数,就是可以在list后面传入一个初始值。 defreduce(function,sequence,initial=None)这个初始值默认是None(reduce(lambdax,y:x+y,name,5))) 还是上面的例子,我加了一个最后初始值为5(默认为none)`运行结果:15 3.filter filter读取iterable的所有item,判断这些item对函数是否为真,返回一个包含iterable的迭代器所有真实的项目。如果函数为None,则返回一个非空项。[AppleScript]纯文本查看__复制代码?1234name`=["czp","cc","zp1"`]print`(list(filter(lambdan:n.endswith("c"),name))) 通过匿名函数判断条件,如果返回值为真,则以列表的形式打印`Operationresult:['cc']{:8_507:}
