![Python高效开发实战:Django、Tornado、Flask、Twisted(第3版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/109/40795109/b_40795109.jpg)
1.4 函数
在编程中使用函数可以写出优雅的程序结构,模块化的结构使程序简单化,并提高了可读性和可维护性。读者在本节之前的示例中已接触过Python函数,本节对函数的主要特性进行详细介绍。
1.4.1 定义与使用
Python中函数定义的关键字是def,语法如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/062-4.jpg?sign=1738776109-xTsyIMFXGhDyC2XvcP32RQQgg1AJ089u-0-b163104b2826d35f49f9c9f8b498ce68)
Python中函数的返回值可以是零个或任意多个,无须在函数定义中显式声明返回值的数量和类型,只需在函数体中用return关键字返回即可;函数的参数可以有任意个。
【示例1-25】函数的定义和调用演示如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/063-1.jpg?sign=1738776109-uaDiVbwcKxwvamOaaKmk8r6njltuK1i6-0-e29c8e28d5361494180ae590b9387098)
代码中定义了3个函数:没有参数和返回值的main()函数、有2个参数和1个返回值的sum()函数、有3个参数和2个返回值的total()函数。将代码保存为func.py,执行结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/063-2.jpg?sign=1738776109-vwsujhVsGMc4mJa5jp8C9MRGrpdf69KW-0-f20aec638ed7af3cb57bb90d8370e0c9)
【示例1-26】函数参数可以定义默认值,当调用者没有提供参数时,函数在执行过程中用默认值设置该参数。比如:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/063-3.jpg?sign=1738776109-TqjnG8sGgaEhaMa6TmzLdgrabNYPSRFM-0-6736d071a6081a66deeb940251472373)
执行该代码的结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/063-4.jpg?sign=1738776109-YkmqntgOjS0H2UqCgMsvt7ZD5RWVzltt-0-1b41ad426a9912393992326612bee3b6)
有默认值的参数必须声明在没有默认值的参数之后,不能出现类似如下形式的函数声明:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/064-2.jpg?sign=1738776109-qPWRRLmjDlinCIImotbAZPELnpOXuV0Z-0-cccf89b4040ce2b066e38db724a943cf)
【示例1-27】在调用函数时,除了按参数的声明顺序传递参数,还可以不按顺序传递命名参数,如下代码演示了命名参数的函数调用方式:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/064-3.jpg?sign=1738776109-EF8gkOdbaZkuLX6hKesxVNhDsneQzc95-0-20df456b7433668fe73856c5476b3c77)
上述代码文件的执行结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/064-4.jpg?sign=1738776109-bYs28fqeCcjWzQHTAwBkUpmctvBGLSMw-0-9f020d33e0a84854bca0cc0542a11a1b)
1.4.2 变长参数
变长参数的函数即参数个数可变、参数类型不定的函数。设计一个参数个数可变、参数类型不定的函数,为函数设计提供了更大的灵活性。Python中允许定义两种类型的函数变长参数。
• 元组变长参数:适用于未知参数的数量不固定、但在函数中使用这些参数时无须知道这些参数的名字的场合。在函数定义中,元组变长参数用星号“*”标记。
• 字典(dict)变长参数:适用于未知参数的数量不固定、而且在函数中使用这些参数时需要知道这些参数的名字的场合。在函数定义中,字典变长参数用双星号“**”标记。
【示例1-28】元组变长参数的使用方法示例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/064-5.jpg?sign=1738776109-AXNTGkBtJiEuCm2WfMqjHYpC2trDlRbE-0-41bd2421e91990ac27205f6b929ebfe9)
代码中的show_message是一个带有固定参数message和变长参数tupleName的函数。在调用show_message时,向其传入了固定参数值“Good morning”和若干其他参数。将代码保存为tuple_param.py,执行结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/065-2.jpg?sign=1738776109-cqrQwQxM1dbeA0k2w4HZge6CV9Rc2qkl-0-7b8e6a2acfcb101efa9ad9343cf9fad6)
【示例1-29】字典变长参数的使用方法示例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/065-3.jpg?sign=1738776109-SRnuxVPQMhpZkqjZsvyLS95Z9yj1UkFl-0-130d43dcac601dcad4b1194302092920)
代码中的check_book()是一个带有字典变长参数dictParam的函数,它的内容是打印参数内容,并且当检查到书的价格大于100元时,输出“*******I want to buy this book!*******”信息。将代码保存为dictionary_param.py,执行结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/065-4.jpg?sign=1738776109-9X5SWF04baQAWZcDEiK9TRqtFILkczyv-0-b3b08a6753a877b61842a4b95166da4e)
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/066-1.jpg?sign=1738776109-xp2gCRfsNTiDxrPzzaQh6q4wxKeJvnqE-0-dd5bf65be86d8d64c89b2225e719c00b)
1.4.3 匿名函数
匿名函数(Anonymous Function)指一类无须定义标识符(函数名)的函数或子程序,普遍存在于多种编程语言中,一般用于只在代码中存在一次函数引用的场合。Python用lambda语法定义匿名函数,只需用表达式而无须声明。lambda语法的定义如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/066-2.jpg?sign=1738776109-jIlscBqbDzPw5l7UnJx3UUrTiqQDrZnt-0-aabadac02538ed075fc134c637ce7ff8)
除了没有函数名,其语义与如下函数的定义相同:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/066-3.jpg?sign=1738776109-uDImsLhAU9QE7YEW65iBTCgH0lNYocD7-0-8bfe8c0de9de350865e3676747ca219d)
lambda函数可以在定义时直接被调用,比如:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/066-4.jpg?sign=1738776109-bikoQZdp76i4A1dxuWKt1M7ugemdO2Qt-0-6c23d712f1862deeddea42d51f6b61c6)
但通常都是在定义lambda函数的同时,将其作为参数传递给另一个函数,该函数将在其处理过程中对lambda定义的函数进行调用。
【示例1-30】lambda代码的示例如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/067-1.jpg?sign=1738776109-vnTLny3wea0Q7lPQ1CknQZsR8bp2J5VM-0-347c947958804e2543be88775e472b72)
以上代码演示了将lambda函数传递给另一个函数call_func()进行处理的过程。在函数call_func()中,首先通过datetime包中的函数datetime.now()打印时间,然后调用被传递的函数。不仅lambda函数可以作为参数传递给其他函数,普通函数也可以作为参数传递。将代码保存为lambda.py,程序的运行结果如下:
![](https://epubservercos.yuewen.com/B61ED0/21190707201160906/epubprivate/OEBPS/Images/067-2.jpg?sign=1738776109-8k2uTf2SPbun4hDDhH8rbSqhVVceYvAZ-0-180191ae1445935d952c49b87d296ac4)
技巧:用datetime.datetime.now()函数可以获取系统的当前时间。