◎知识点
函数的定义之多个返回值
函数的定义之pass语句
函数的定义之文档字符串
函数的定义之函数注解
递归函数
◎脚本练习
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@FileName: function_return.py
@Function: python function return
@Author: Zhihe An
@Site: https://chegva.com
@Time: 2021/7/4
"""
"""一、函数的定义之多个返回值"""
"""
如果需要在调用函数后有多个返回值,可以在定义函数时在函数体内使用return语句返回由多个返回值组成的元组
"""
# 把列表中的所有数分成奇数和偶数两类
def classify_numbers(numbers):
odds = []
evens = []
# 使用列表生成式之if-else
# [odds.append(number) if number % 2 else evens.append(number) for number in numbers]
for number in numbers:
if number % 2:
odds.append(number)
else:
evens.append(number)
return odds, evens
print(classify_numbers([15, 86, 39, 26, 53, 68])) # ([15, 39, 53], [86, 26, 68])
# 查找列表中的最小值和最大值
def lookup_min_max(numbers):
if len(numbers) == 0:
return
min_num = max_num = numbers[0]
for number in numbers[1:len(numbers)]:
if number < min_num:
min_num = number
elif number > max_num:
max_num = number
return min_num, max_num
print(lookup_min_max([35, 26, 19, 86, 93, 68])) # (19, 93)
"""二、pass语句"""
"""
pass语句什么都不做,它只是一个占位符,用在语法上需要语句的地方,例如:
(1) if语句的条件执行体
(2) for-in语句的循环体
(3) 定义函数时的函数体
有时候可能还没有想好上述相关语句该怎么写,就可以先使用pass语句作为占位符,以确保程序可以运行,
等想好了之后再把pass语句替换掉
"""
age = 23
if age > 18:
pass
for i in range(8):
pass
def do_something():
pass
"""三、函数的定义之文档字符串"""
"""
1、什么是文档字符串?
对于函数、模块、类或方法,位于其第一行的字符串被称为文档字符串,通常用三个引号表示
文档字符串用于对函数、模块、类或方法进行解释说明
之所以称为"文档"字符串,是因为可以使用工具根据文档字符串自动地生成文档
应该养成编写文档字符串的习惯,以提高程序的可读性
通过属性__doc__可以访问文档字符串
调用内置函数help()得到的帮助信息中会包含文档字符串
"""
print(len.__doc__)
print(help(len))
"""
2、函数的文档字符串的常见内容和格式约定
(1) 第一行是简明扼要的总结
(2) 第一行的首字母大写,第一行以句号结尾
(3) 如果文档字符串包含多行,第二行是空行,从第三行开始是详细的描述
更多关于文档字符串的约定,可参考PEP 257: https://www.python.org/dev/peps/pep-0257
"""
def form_complex(real = 0.0, imag = 0.0):
"""Form a complex number.
Keyword arguments:
real -- the real part(default 0.0)
imag -- the imaginary part(default 0.0)
"""
pass
"""四、函数的定义之函数注解"""
"""
1、什么是函数注解?
定义函数时,为了让形参或返回值的类型或作用更加清晰,可以给形参或返回值添加函数注解,
从而对形参或返回值做解释说明,以帮助函数文档化
函数注解是可选的,可以添加也可以不添加
函数注解可以是任意的表达式
解释器会忽略函数注解,因此解释器并不会使用函数注解来检查实参的类型的返回值的类型
更多关于函数注解,可参考PEP 3107 https://www.python.org/dev/peps/pep-3107/
"""
"""
2、添加函数注解
给形参添加函数注解的方式为:在形参后面添加:和任意的表达式
给返回值添加函数注解的方式为:在)的后面添加->和任意的表达式
"""
def f(a: 'string type', b: int) -> 'join a with b':
return a + str(b)
print(f('hello', 12.3)) # hello12.3
"""
3、访问函数注解
通过属性__annotations__可以访问函数注解
调用内置函数help()得到的帮助信息中会包含函数注解
"""
# {'a': 'string type', 'b': <class 'int'>, 'return': 'join a with b'}
print(f.__annotations__)
print(help(f))
"""五、递归函数"""
"""
1、什么是递归函数?
在一个函数的函数体内,可以调用其它函数
如果在一个函数的函数体内调用了该函数本身,该函数就是递归函数
递归函数包含了一个隐式的循环,因此,递归函数必须有一个明确的递归结束条件,也称为递归出口
能用递归来解决的问题必须满足两个条件:
(1) 可以通过递归调用来缩小问题的规模,且新问题与原问题有着相同的形式
(2) 存在一种简单情境,可以使递归在简单情境下退出
递归函数的优点是定义简单,逻辑清晰
"""
"""
2、使用递归计算阶乘
n! = 1 * 2 * 3 ... * n = (n-1)! * n, 且1! = 1
如果用函数fac(n)表示n!,那么fac(n) = fac(n - 1) * n = n * fac(n -1),且fac(1) = 1
"""
def fac(n):
"""使用递归计算阶乘"""
if n == 1:
return 1
return n * fac(n -1)
print('fac(6) =', fac(6)) # fac(6) = 720
"""
3、使用递归计算斐波那切数列
F0 = 0, F1 = 1, Fn = F(n - 1) + F(n -2)(n >= 2)
如果用函数fib(n)表示Fn,那么fib(n) = fib(n - 1) + fib(n - 2),
且fib(0) = 0, fib(1) =1
"""
def fib(n):
"""使用递归计算斐波那切数列"""
if n == 0:
return 0
if n == 1:
return 1
return fib(n - 1) + fib(n - 2)
print('fib(6) =', fib(6)) # fib(6) = 8▽ 添加函数注解
◎脚本地址:
