函数可以通过关键字 def 来定义。这一关键字后跟一个函数的标识符名称,再跟一对圆括号,其中可以包括一些变量的名称,再以冒号结尾,结束这一行。随后而来的语句块是函数的一部分。
可变参数
return语句
def say_hello():
print("Hello world")
say_hello()
say_hello()
运行结果:
下面看一看带参的函数:
def print_max(a, b):
if a > b:
print(a, "is maximum")
elif a == b:
print(a, "is equal to", b)
else:
print(b, "is maximum")
print_max(3, 4)
x = 5
y = 7
print_max(x, y)
运行结果:
上面的都是一眼就能看出来的。。。很简单的代码。。。
下面讲讲局部变量。
其实和C++一样,是一个作用域的问题。不过因为刚学过编译原理所以不禁会想起控制链访问链、静态访问局部数据区(扯远了23333)
x = 50
def func(x):
print("x is", x)
x = 2
print("Changed local x to", x)
func(x)
print("x is still", x)
运行结果:
global语句
如果你想给一个在程序顶层的变量赋值(也就是说它不存在于任何作用域中,无论是函数还是类),那么你必须告诉 Python 这一变量并非局部的,而是全局(Global)的。我们需要通过 global 语句来完成这件事。因为在不使用 global 语句的情况下,不可能为一个定义于 函数之外的变量赋值。
通过使用 global 语句便可清楚看出这一变量是在最外边的代码块中定义的。
x = 50
def func():
global x
print("x is", x)
x = 2
print("Changed global x to", x)
func()
print("Value of x is", x)
运行结果:
global 语句用以声明 x 是一个全局变量——因此,当我们在函数中为 x 进行赋值时,这一改动将影响到我们在主代码块中使用的 x 的值。
可以在同一句 global 语句中指定不止一个的全局变量,例如 global x, y, z 。
可以在同一句 global 语句中指定不止一个的全局变量,例如 global x, y, z 。
默认参数值
def say(message, times=1):
print(message * times)
say("Hello")
say("World", 5)
运行结果:
关键字参数
对于含有多个参数的函数,可以只对其中的几个进行指定,且不要求顺序。其它参数都有默认参数值。
def func(a, b=5, c=10):
print("a is", a, "and b is", b, "and c is", c)
func(3, 7)
func(25, c=24)
func(c=50, a=100)
运行结果:
在第二次调用函数时, func(25, c=24) ,由于其所处的位置,变量 a 首先获得了值 25。然后,由于命名——即关键字参数——指定,变量 c 获得了值 24 。变量 b 获得默认参数值 5 。
可变参数
参数数量可变,可以通过星号来实现。
当声明一个诸如*param的星号参数时,从此处开始直到结束的所有位置参数都将被收集并汇集成一个成为param的元组Tuple.
当声明一个诸如**param的双星号参数时,从此处开始直至结束的所有关键字参数都将被收集并汇集成一个名为param的字典Dictionary.
当声明一个诸如**param的双星号参数时,从此处开始直至结束的所有关键字参数都将被收集并汇集成一个名为param的字典Dictionary.
def total(a=5, *numbers, **phonebook):
print("a", a)
# 遍历元组中的所有项目
for single_item in numbers:
print("single_item", single_item)
# 遍历字典中的所有项目
for first_part, second_part in phonebook.items():
print(first_part, second_part)
print(total(10, 1, 2, 3, Jack=1123, John=2231, Inge=1560))
运行结果:
return语句
return 语句用于从函数中返回,也就是中断函数。我们也可以选择在中断函数时从函数中返回一个值。
def maximum(x, y):
if x > y:
return x
elif x == y:
return "The numbers are equal"
else:
return y
print(maximum(2, 3))
运行结果:输出3
每一个函数都在其末尾隐含了一句 return None ,除非你写了你自己的 return 语句。
def some_function():
pass
print(some_function())
运行结果:输出None
pass语句用于只是一个没有内容的语句块。
DocStrings 文档字符串
函数的第一行逻辑行中的字符串是该函数的文档字符串(DocString)。
该文档字符串所约定的是一串多行字符串,其中第一行以某一大写字母开始,以句号结束。 第二行为空行,后跟的第三行开始是任何详细的解释说明。 建议文档字符串遵循这一约定。
def print_max(x, y): '''Prints the maximum of two numbers.
The two values must be integers.''' x = int(x) # 先将其转换至整数类型 y = int(y) if x > y: print(x, "is maximum") else: print(y, "is maximum") print_max(3, 5) print(print_max.__doc__)
可以通过使用函数的
__doc__
(注意其中的双下划线)属性(属于函数的名称)来获取函数 print_max 的文档字符串属性。只消记住 Python 将所有东西都视为一个对象,包括函数。
运行结果: