函数(Function)指的是一个可重用的程序片段。它们允许您为代码块分配名称,允许您使用该特定名称在程序中的任何位置运行代码块,并重复任意次数。这称为调用函数。我们已经使用了许多内置函数,例如len和range。可以使用关键字def定义函数。这个关键字后面是一个函数的标识符名称,后面是一对括号,其中可能包括一些变量的名称,最后是一个冒号来结束该行。后面的语句块是函数的一部分。下面的例子将展示这是多么容易:defsay_hello():#该块属于这个函数print('helloworld')#函数结束say_hello()#调用函数say_hello()#再次调用函数输出:helloworld它是如何工作的我们以上述方式定义了一个名为say_hello的函数。这个函数没有参数,所以括号内没有声明变量。函数的参数只是输入到函数中,这样我就可以给它传递不同的值,得到相应的结果。请注意,我们可以调用同一个函数两次,这意味着我们不必重新编写代码。函数参数函数中的参数是通过将它们放在定义函数的一对括号内指定的,并以逗号分隔。当我们调用该函数时,我们以相同的形式提供所需的值。请注意此处使用的术语——定义函数时提供的名称称为“参数”,调用函数时提供给函数的值称为“参数”。defprint_max(a,b):ifa>b:print(a,'是一个比较大的数')elifa==b:print(a,'等于',b)else:print(b,'是acomparisonBignumber')#直接传字面值print_max(3,4)x=5y=7输出4是一个比较大的数Howitworks这里我们将函数命名为print_max,使用两个参数makea和b.我们使用一个简单的if...else语句来找到更大的数字并打印出来。第一次调用函数print_max时,我们将这个数字作为参数直接提供给函数。在对的第二次调用中,我们以变量作为参数调用函数。print_max(x,y)会将实参x的值赋给形参a,将实参y的值赋给形参b。在这两个调用中,print_max的工作方式相同。局部变量当您在函数定义内声明变量时,它们与函数外的同名变量没有任何关系,也就是说,那些变量名只存在于函数的局部(Local)。这称为变量的范围。所有变量的范围是它们被定义的块,从定义它们的名称的定义点开始。示例:x=50deffunc(x):print('xis:',x)x=2print('changelocalvariablexto',x)output:xis:50当我们打印出来时它是如何工作的存在于函数块第一行的名为x的值,Python使用在函数声明上方的主代码块中声明的此参数的值。接下来,我们将值2赋给x。x是我们函数的局部变量。因此,当我们在函数中改变x的值时,主代码块中的x不会受到影响。通过最后的print语句,我们显示了在主代码块中定义的x的值,从而确认它实际上不受先前调用的函数中局部变量的影响。global语句如果你想在程序的顶层给一个变量赋值(即它不存在于任何范围内,无论是函数还是类),那么你必须告诉Python这个变量是不是本地的,而是全球(Global)的。我们需要用全局语句来做到这一点。因为不使用global语句是不可能给函数外定义的变量赋值的。您可以使用函数外部定义的变量的值(假设函数内部没有同名变量)。但是,这种方法不被鼓励并且应该避免,因为对于程序的读者来说,弄清楚变量定义的确切位置是模棱两可的。通过使用global语句,很明显这个变量定义在最外层的代码块中。case:x=50deffunc():globalxprint('x是:',x)x=2print('将全局变量改为',x)func()print('x的值为',x)output:xis:50工作原理global语句用来声明x是一个全局变量——所以当我们在函数中给x赋值时,这个变化会影响到我们在主代码中使用的x块值。您可以在同一个全局语句中指定多个全局变量,例如globalx,y,z。默认参数值对于某些函数,您可能希望将某些参数设为可选并使用默认值,以防用户不想为它们提供值。默认参数值可以有效帮助解决这种情况。您可以通过在函数定义中附加赋值运算符(=)来为参数分配默认参数值。casedefsay(message,times=1):print(message*times)say('Hello')say('World',5)outputHello打印一堆字符串。如果我们不提供值,则该字符串默认只打印一次。我们通过为参数时间指定默认参数值1来做到这一点。第一次使用say时,我们只提供字符串,所以函数只会打印一次字符串。第二次使用say时,我们同时提供了字符串和一个参数5,表示我们要将这个字符串说(Say)五次。注意,只有那些在参数列表末尾的参数才能被赋予默认参数值,这意味着在函数的参数列表中,不能将具有默认参数值的参数放在没有默认参数值的参数之前。这是因为值是按照参数所在位置的顺序赋值的。例如,deffunc(a,b=5)有效,但deffunc(a=5,b)无效。关键字参数如果你有一个有很多参数的函数,而你只想指定其中的一些参数,你可以通过命名它们来为这些参数赋值——这就是关键字参数(KeywordArguments)——我们使用名称(关键字)代替在函数中指定参数的位置(我们一直使用的方式)有两个优点。一,我们不再需要担心参数的顺序,函数的使用会更简单。其次,我们只能给那些我们希望赋值的参数赋值,只要其他参数有默认参数值即可。casedeffunc(a,b=5,c=10):print('ais:',a,'bis:',b,'cis:',c)func(3,7)func(25,c=24)func(c=50,a=100)输出ais:3bis:7cis:10它是如何工作的一个名为func的函数有一个没有默认参数值的参数,后跟两个参数,每个参数都有一个默认参数值。在第一次调用函数func(3,7)时,参数a获得值3,参数b获得值7,而c获得默认参数值10。在第二次调用函数func(25,c=24)时,变量a由于其位置而首先获得值25。然后,由于命名(即关键字参数)规范,变量c获得值24。变量b获得默认参数值5。在第三次调用函数func(c=50,a=100)时,我们都使用关键字参数来指定值。这里要注意,即使a定义在c之前,我们仍然在变量a之前指定变量c。可变参数有时你可能想定义一个函数,它可以有任意数量的变量,即参数的数量是可变的。这可以通过使用星号来实现。示例deftotal(a=5,*numbers,**phonebook):print('a',a)#遍历元组中的所有项目fornuminnumbers:print('numitemis:',num)#在phonebook.items()中遍历字典中的key,val的所有项:print(key,val)print(total(10,1,2,3,Jack=1123,John=2231,Inge=1560))输出a10当我们声明一个如*param的时候是如何工作的当指定一个星号参数时,从这里直到最后的所有位置参数都会被收集并组装成一个名为“param”的元组。同样的,当我们声明一个双星号的参数比如**param时,从这里到最后的所有关键字参数都会被收集起来,组装成一个名为param(Dictionary)的字典。return语句return语句用于从函数返回,即中断函数。我们也可以选择在中断函数时从函数返回一个值defmaximum(x,y):ifx>y:returnxelifx==y:return'两个数相等'else:returnyprint(maximum(2,3))输出:3工作原理maximum函数将返回参数中的最大值,在本例中为提供给函数的数字。它使用一组简单的if...else语句来查找较大的值并返回它。请注意,如果return语句未与任何值配对,它将返回None。None是Python中的一种特殊类型,不代表任何内容。例如,它用于表示一个变量没有值,如果有,它的值就是None(无)。除非您编写自己的return语句,否则每个函数都在末尾暗示一个returnNone。您可以在some_function不使用return语句的地方运行print(some_function()),如下所示:defsome_function():passPython中的pass语句用于指示没有内容的语句块。提示:有一个名为max的内置函数已经实现了“寻找最大数”,因此请尽可能使用它。DocStringsDocumentationStringsPython有一个很棒的特性,称为DocumentationStrings,通常简称为docstrings。DocStrings是一个重要的工具,您应该使用它来帮助您更好地记录您的程序并使它们更容易理解。令人惊讶的是,我们甚至可以传递一个函数来在程序实际运行时获取文档!Casedefprint_max(x,y):'''打印两个值的最大值。两个数字都应该是整数'''#如果可能的话转换成整数类型x=int(x)y=int(y)ifx>y:print(x,'bigger')else:print(y,'bigger')print_max(3,5)print(print_max.__doc__)打印大5)。这里需要注意的是,文档字符串同样适用于后面相关章节会提到的模块(Modules)和类(Class)。,以句点结尾。第二行是空行,后面是第三行开头的任何详细解释。强烈建议您在所有重要功能的所有文档字符串中遵循此约定。我们可以通过函数的doc(注意双下划线)属性(属于函数名)获取函数print_max的docstring属性。请记住,Python将一切都视为一个对象,这自然包括函数。我们将在稍后的类(Class)章节中讨论更多关于对象的细节。自动化工具可以通过这种方式检索程序中的文档。因此,我强烈建议您为您编写的所有重要函数提供文档字符串。Python发行版附带的pydoc命令的工作方式类似于help()和文档字符串。嵌套函数python允许创建嵌套函数。也就是说,我们可以在函数内部定义函数,现有作用域和变量生存期不变。注意:1.外部函数的变量可以被内部函数使用,但不能被内部函数修改。如果要修改,需要加上关键字nonlocaldefmax(a,b):returnaifa>belsebprint(max(5,2))#5defthe_max(x,y,z):c=max(x,y)returnmax(c,z)print(the_max(1,5,3))#5输出5个嵌套函数:1.封装-数据隐藏:“嵌套函数”不能被外部访问,2.减少重复代码3.闭包闭包什么是闭包?如果一个函数定义在另一个函数的范围内并且引用外部函数的变量,则该函数称为闭包。闭包是Python支持的一个特性。它允许在非全局范围内定义的函数引用其周围空间中的变量。这些周围空间所引用的变量,称为这个函数的环境变量。环境变量和这个非全局函数一起构成了闭包。defouter():a=1definner():print(a)returninnerinn=outer()inn()#1闭包特性:一个函数返回的函数对象,这个函数对象的执行依赖于不在里面的变量函数值,此时函数实际返回的内容如下:1函数对象2函数对象需要的外部变量和变量值在函数外使用内部函数总结我们学到了很多功能方面,但我们仍然没有涵盖所有类型的功能。但是,我们已经介绍了您将在日常使用中使用的大部分Python函数。接下来,我们将了解如何创建和使用Python模块。IT入门感谢您关注练习地址:www.520mg.com/it
