基础永远值得花费90%的精力去学习加强。认识实践的重要性。
Ax Python Functions | 函数
函数是用于执行单个相关操作的有组织的、可重用的代码块。函数为应用程序提供了更好的模块化和高度的代码重用。
正如您已经知道的,Python提供了许多内置函数,如print()等,但您也可以创建自己的函数。这些函数称为用户定义函数。
定义
定义函数的规则
- 函数以关键字def开头,后面跟着函数名和圆括号
- 参数在括号内
- 函数的第一条语句可以是可选语句,函数的文档字符串或docstring
- 函数中的代码块以: 开始并缩进。
- return [expression]语句退出一个函数,并可选地将一个表达式返回给调用者。不带参数的return语句与return None相同。
语法
def functionname( parameters ):
"function_docstring"
function_suite
return [expression]
默认情况下,参数具有位置行为,您需要按照定义它们的顺序通知它们。
例
def printme( str ):
"This prints a passed string into this function"
print(str)
return
调用
定义函数只会给它一个名称,指定函数中包含的参数,并构造代码块。
一旦确定了函数的基本结构,就可以通过从另一个函数或直接从Python提示符调用它来执行它。下面是调用printme()函数−的示例
#!/usr/bin/python
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print(str)
return;
# Now you can call printme function
printme("I'm first call to user defined function!")
printme("Again second call to the same function")
执行 −
I'm first call to user defined function!
Again second call to the same function
通过引用和值的传递
Python 语言中的所有参数(参数)都是通过引用传递的。这意味着如果您更改函数中参数所指的内容,则更改也会反映在调用函数中。
#!/usr/bin/python
# Function definition is here
def changeme( mylist ):
"This changes a passed list into this function"
mylist.append([1,2,3,4]);
print("Values inside the function: ", mylist)
return
# Now you can call changeme function
mylist = [10,20,30];
changeme( mylist );
print("Values outside the function: ", mylist)
执行
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
另一个例子,通过引用传递函数内部和函数外部的参数
#!/usr/bin/python
# Function definition is here
def changeme( mylist ):
"This changes a passed list into this function"
mylist = [1,2,3,4];
print("values inside the function: ", mylist)
return
mylist = [10,20,30]
changeme( mylist );
print("values outside the function: ", mylist)
参数mylist是函数 changeme 的本地参数。在函数中更改 mylist 不会影响mylist。该函数什么也没做,最后这将产生以下结果 -
values inside the function: [1, 2, 3, 4]
values outside the function: [10, 20, 30]
参数
您可以使用以下形式参数类型来调用函数
- Required arguments | 位置参数
- Keyword arguments | 关键字参数
- Default arguments | 默认参数
- Variable-length arguments | 不定长参数
位置参数
参数的顺序,数量必须一致,否则报错。
关键字参数
书写正确的形参名字
#!/usr/bin/python
# Function definition is here
def printinfo( name, age ):
"This prints a passed info into this function"
print "Name: ", name
print "Age ", age
return;
# Now you can call printinfo function
printinfo( age=50, name="miki" )
执行
Name: miki
Age 50
默认参数
调用时没有指定值,那么将使用函数默认定义的值。
#!/usr/bin/python
# Function definition is here
def printinfo( name, age = 35 ):
"This prints a passed info into this function"
print "Name: ", name
print "Age ", age
return;
# Now you can call printinfo function
printinfo( age=50, name="miki" )
printinfo( name="miki" )
执行
Name: miki
Age 50
Name: miki
Age 35
可变长度参数
可以使用更多的参数,而不需要在函数中定义。他会存储在一个元组或字典中。语法:
def functionname([formal_args,] *var_args_tuple ):
"function_docstring"
function_suite
return [expression]
星号 (*) 放置在包含所有非关键字变量参数值的变量名称之前。如果在函数调用期间未指定其他参数,则此元组保持为空。以下是一个简单的例子
def printinfo( arg1, *vartuple ):
"This prints a variable passed arguments"
print("Output is:")
print(arg1)
for var in vartuple:
print(var)
return
printinfo( 10 )
printinfo( 70, 60, 50 )
printinfo( 1)
执行
Output is:
10
Output is:
70
60
50
Output is:
1
匿名函数
特点
- lambda 只是一个表达式,函数体比 def 简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda 函数拥有自己的命名空间,像嵌套的函数定义,lambda 函数可以从包含它的作用域中引用变量。
语法
lambda [arg1 [,arg2, ... argN]] : expression
有些时候,当我们在传入函数时,不需要显式地定义函数,直接传入匿名函数更方便。匿名函数有个限制,就是只能有一个表达式,无需写return,返回值就是该表达式的结果。用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数。
例
# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print("相加后的值为 : ", sum(10, 20))
print("相加后的值为 : ", sum(20, 20))
执行
相加后的值为 : 30
相加后的值为 : 40
直接调用匿名函数本身
print((lambda x, y: x-y)(3, 4))
但通常都是在定义lambda函数的同时将其应用作为参数传递给另一个函数,该函数在其处理过程中对lambda定义的函数进行调用,例如:
L = [1, 2, 3, 4, 5, 6, 7, 8]
# 过滤掉所有的偶数
res = filter(lambda x: x % 2 == 1, L)
print(list(res))
找出两个数中小的那一个,我们可以用lambda这么写
fn = lambda x, y: x if x < y else y
print(fn(1, 2))
相乘
func = lambda x, y: x*y
print(func(2,3))
使用可变长参数求和
func = lambda *args: sum(args)
print(func( 1, 2, 3, 4, 5))
使用键值方式的可变长参数,输出为1
key = lambda **kwargs: 1
print(key(name='steven',age=36,name2='co'))
返回语句
语句 return [expression] 退出一个函数,可选择将一个表达式传回给调用者。没有参数的 return 语句与 return None 相同。
以上所有示例均未返回任何值。您可以从函数返回一个值,如下所示 -
#!/usr/bin/python
# Function definition is here
def sum( arg1, arg2 ):
# Add both the parameters and return them."
total = arg1 + arg2
print("Inside the function : ", total)
return total;
# Now you can call sum function
total = sum( 10, 20 );
print("Outside the function : ", total )
执行上述代码时,会产生以下结果 -
Inside the function : 30
Outside the function : 30
变量范围
程序中的所有变量可能无法在该程序的所有位置访问。这取决于您声明变量的位置。
变量的范围决定了您可以访问特定标识符的程序部分。Python中有两个基本的变量范围 -
- 全局变量
- 局部变量
全局变量与局部变量
在函数体内部定义的变量具有局部作用域,而在外部定义的变量具有全局作用域。
这意味着局部变量只能在声明它们的函数内部访问,而全局变量可以在整个程序体中被所有函数访问。当你调用一个函数时,它里面声明的变量被带入作用域。以下是一个简单的例子 -
#!/usr/bin/python
total = 0; # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
# Add both the parameters and return them."
total = arg1 + arg2; # Here total is local variable.
print("Inside the function local total : ", total)
return total;
# Now you can call sum function
sum( 10, 20 );
print("Outside the function global total : ", total )
执行上述代码时,会产生以下结果 -
Inside the function local total : 30
Outside the function global total : 0