|
目录一、函数的定义二、函数的调用三、函数的参数3.1可变与不可变对象3.2函数参数传递3.3参数类型四、匿名函数五、函数的return语句六、作用域七、python的模块化八、main函数一、函数的定义 函数是经过精心组织、可重复使用的代码片段,用于实现单一功能或相关联的一系列功能。 通过使用函数,可以提升应用程序的模块化程度,并增强代码的复用性。你已经熟悉了Python提供的众多内置函数,例如print()。此外,你还可以自行创建函数,这些函数被称为用户自定义函数。定义一个函数 你可以根据自身需求定义一个具有特定功能的函数。以下是定义函数的基本规则:函数代码块以def关键字开头,后跟函数标识符名称和圆括号()。任何传入的参数和自变量必须放置在圆括号内。圆括号内可用于定义参数。函数的第一行语句可以选择性地使用文档字符串——用于存放函数说明。函数内容以冒号:起始,并且需要缩进。return[表达式]语句用于结束函数,并选择性地返回一个值给调用方。不带表达式的return语句相当于返回None。示例:defgreet(name):"""这是一个简单的函数,用于打印问候语。:paramname:接收一个字符串参数,表示名字。"""print(f"Hello,{name}!")二、函数的调用 定义一个函数仅仅是赋予了函数一个名称,明确了函数所包含的参数,以及代码块的结构。一旦这个函数的基本结构构建完毕,你便可以通过在另一个函数中调用来执行它,或者直接从Python的交互式提示符(如IDLE或命令行)中执行。函数调用示例:#!/usr/bin/python#-*-coding:UTF-8-*-#定义函数defprintme(str):"打印任何传入的字符串"printstrreturn#调用函数printme("我要调用用户自定义函数!")printme("再次调用同一函数")三、函数的参数3.1可变与不可变对象 在Python中,类型是与对象相关联的,而变量本身并不具有类型。例如:a=[1,2,3]a="Runoob" 在这段代码中,`[1,2,3]`是一个列表(List)类型对象,`"Runoob"`是一个字符串(String)类型对象,而变量`a`本身并不具有类型,它只是对象的一个引用(或者说是一个指针),可以指向列表类型的对象,也可以指向字符串类型的对象。###可变与不可变对象 在Python中,字符串(strings)、元组(tuples)和数字(numbers)是不可变对象,而列表(list)、字典(dict)等则是可变对象。-**不可变类型**:当变量被赋值`a=5`后,再赋值`a=10`,实际上是新生成了一个整数值对象`10`,然后让`a`指向这个新对象,而原来的值`5`被丢弃。这并不是改变`a`的值,而是相当于新生成了`a`。-**可变类型**:当变量被赋值`la=[1,2,3,4]`后,再赋值`la[2]=5`,这是将列表`la`的第三个元素的值更改,列表`la`本身并没有被替换,只是其内部的一部分值被修改了。3.2函数参数传递###函数参数传递 在Python中,函数的参数传递可以分为两种情况:-**不可变类型**:类似于C++中的值传递,例如整数、字符串、元组。如`fun(a)`,传递的只是`a`的值,不会影响`a`对象本身。如果在`fun(a)`内部修改`a`的值,只是修改了另一个复制的对象,不会影响`a`本身。-**可变类型**:类似于C++中的引用传递,例如列表、字典。如`fun(la)`,则是将`la`真正的传过去,修改后函数外部的`la`也会受到影响。 在Python中,一切都是对象,严格意义上我们不能简单地说值传递还是引用传递,而应该说传递的是不可变对象还是可变对象。 实参:在调用函数时,可以通过参数将一些值传递给函数处理,这些在调用函数时提供给函数的值称为实参。 形参:在定义函数时,函数名后面括号中的变量称为形参。如果形参个数超过1个,各个参数之间用逗号隔开。Python传递不可变对象的实例 以下是一个演示Python传递不可变对象的示例(适用于Python2.0+):#!/usr/bin/python#-*-coding:UTF-8-*-defChangeInt(a):a=10b=2ChangeInt(b)printb#结果是2 在这个示例中,有一个整数对象`2`,变量`b`指向这个对象。当`b`传递给`ChangeInt`函数时,实际上是按值传递的方式复制了变量`b`,使得`a`和`b`都指向同一个整数对象。当在函数内部执行`a=10`时,新生成一个整数值对象`10`,并让`a`指向它,而原来的整数对象`2`并未改变。传递可变对象的实例以下是一个演示Python传递可变对象的示例(适用于Python2.0+):#!/usr/bin/python#-*-coding:UTF-8-*-#可写函数说明defchangeme(mylist):"""修改传入的列表"""mylist.append([1,2,3,4])print"函数内取值:",mylistreturn#调用changeme函数mylist=[10,20,30]changeme(mylist)print"函数外取值:",mylist 在这个示例中,传入函数和在末尾添加新内容的对象使用的是同一个引用。因此,输出结果如下:函数内取值: [10,20,30,[1,2,3,4]]函数外取值: [10,20,30,[1,2,3,4]] 这表明,当传递可变对象(如列表)时,函数内部对对象的修改会影响到函数外部的对象。3.3参数类型Python函数参数类型在调用Python函数时,可以使用以下几种正式参数类型: 必需参数 关键字参数 默认值参数 可变长度参数1)必需参数 必需参数必须按照函数声明时的顺序传递。调用时提供的参数数量必须与声明时一致。例如,调用`printme()`函数时,必须提供一个参数,否则会导致语法错误:示例(Python2.0+)#!/usr/bin/python#-*-coding:UTF-8-*-#函数定义defprintme(str):"打印传入的字符串"printstrreturn#调用printme函数printme() 上述代码的输出结果:Traceback(mostrecentcalllast): File"test.py",line11,in printme()TypeError:printme()takesexactly1argument(0given)2)关键字参数 关键字参数与函数调用紧密相关,允许在调用函数时通过参数名指定参数值。 使用关键字参数时,参数的顺序可以与声明时不一致,因为Python解释器能够通过参数名匹配参数值。以下示例展示了在调用`printme()`函数时使用参数名:示例(Python2.0+)#!/usr/bin/python#-*-coding:UTF-8-*-#函数定义defprintme(str):"打印传入的字符串"printstrreturn#调用printme函数printme(str="Mystring")上述代码的输出结果:Mystring进一步说明关键字参数顺序不重要:示例(Python2.0+)#!/usr/bin/python#-*-coding:UTF-8-*-#函数定义defprintinfo(name,age):"打印传入的字符串"print"Name:",nameprint"Age",agereturn#调用printinfo函数printinfo(age=50,name="miki")上述代码的输出结果:Name:mikiAge503)默认值参数 如果在调用函数时未提供默认值参数的值,则使用默认值。以下示例展示了如果未传入`age`参数,则使用默认值35:示例(Python2.0+)#!/usr/bin/python#-*-coding:UTF-8-*-#函数定义defprintinfo(name,age=35):"打印传入的字符串"print"Name:",nameprint"Age",agereturn#调用printinfo函数printinfo(age=50,name="miki")printinfo(name="miki")上述代码的输出结果:Name: mikiAge 50Name: mikiAge 354)可变长度参数 有时可能需要一个函数能够处理比声明时更多的参数。这些参数称为可变长度参数,声明时不命名。基本语法如下:deffunctionname([formal_args,]*var_args_tuple):"函数文档字符串"function_suitereturn[expression] 带有星号(*)的变量名会存储所有未命名的变量参数。以下是可变长度参数的示例:示例(Python2.0+)#!/usr/bin/python#-*-coding:UTF-8-*-#函数定义defprintinfo(arg1,*vartuple):"打印传入的参数"print"输出:"printarg1forvarinvartuple:printvarreturn#调用printinfo函数printinfo(10)printinfo(70,60,50)上述代码的输出结果:输出:10输出:706050四、匿名函数 在Python中,匿名函数是一种没有名字的函数,通常用于需要一个简单函数但不想为其定义一个完整函数的情况。匿名函数使用`lambda`关键字来创建,其语法如下:lambda参数1,参数2,...:表达式 `lambda`函数可以有任意数量的参数,但只能有一个表达式。这个表达式的结果就是`lambda`函数的返回值。以下是一些使用`lambda`函数的示例:1.**基本用法**:add=lambdax,y:x+yresult=add(3,5)print(result)#输出:82.**作为参数传递给其他函数**:numbers=[1,2,3,4,5]squared_numbers=list(map(lambdax:x**2,numbers))print(squared_numbers)#输出:[1,4,9,16,25]3.**在列表推导式中使用**:numbers=[1,2,3,4,5]squared_numbers=[x**2forxinnumbers]print(squared_numbers)#输出:[1,4,9,16,25]4.**作为排序的关键函数**:pairs=[(1,'one'),(2,'two'),(3,'three'),(4,'four')]pairs.sort(key=lambdapair:pair[1])print(pairs)#输出:[(4,'four'),(1,'one'),(3,'three'),(2,'two')]5.**结合`filter`函数使用**:numbers=[1,2,3,4,5,6,7,8,9,10]even_numbers=list(filter(lambdax:x%2==0,numbers))print(even_numbers)#输出:[2,4,6,8,10] `lambda`函数的主要优点是简洁和方便,特别适合用于需要一个简单函数但不想为其定义一个完整函数的情况。然而,对于复杂的逻辑,建议使用常规的`def`定义函数,以提高代码的可读性和可维护性。由此总结:`lambda`是一种简洁的表达式形式,其函数体相较于传统的`def`定义更为精简。`lambda`的核心是一个单一的表达式,而非复杂的代码块,这限制了它在表达逻辑上的复杂性。`lambda`函数具有独立的命名空间,无法访问其参数列表之外或全局命名空间中的变量。尽管`lambda`函数通常以单行形式呈现,但这并不意味着它等同于C或C++中的内联函数。内联函数的目的是通过减少函数调用的开销来提高运行效率,而`lambda`函数则主要用于简化代码和提供临时的函数定义。五、函数的return语句 在Python中,`return`语句用于从函数中返回一个值,并终止函数的执行。`return`语句可以返回任意类型的对象,包括但不限于整数、字符串、列表、字典等。如果函数中没有`return`语句,或者`return`语句没有指定返回值,函数将默认返回`None`。以下是一些关于`return`语句的详细说明和示例:1.**基本用法**:defadd(a,b):returna+bresult=add(3,5)print(result)#输出:82.**返回多个值**:  ython允许使用`return`语句返回多个值,这些值会被自动打包成一个元组。defget_name_and_age():name="Alice"age=30returnname,agename,age=get_name_and_age()print(name)#输出:Aliceprint(age)#输出:303.**返回None**: 如果函数没有`return`语句,或者`return`语句后面没有指定返回值,函数将返回`None`。defsay_hello():print("Hello!")result=say_hello()print(result)#输出:None4.**提前终止函数**: `return`语句可以用于提前终止函数的执行。defcheck_age(age):ifage
|
|