Function


定义函数

提供需要的功能,Python中函数的规则:

  • 关键字def FunctionName ()
  • 任何参数都要放到括号内
  • 函数的第一句可以是可选语句:函数的文档说明字符串
  • 每个函数的代码块以冒号缩进(遇到冒号则进行一级的缩进)
  • return [expression] 退出函数或返回给调用函数,没有参数的返回语句与return None相同

语法

def functionname(parameters):
   "function_docstring"
   function_suite
   return [expression]

调用函数

定义函数仅是给定了函数名,参数和代码块,要让函数运行还需要用用其他函数调用;

# 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中所有参数的传递都是引用传递,意味着如果更改参数在函数中引用的内容,则更改也会反映在回调函数中:

# 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]]

函数参数

可以使用以下类型的正式参数调用函数

  • Required arguments
  • Keyword arguments
  • Default arguments
  • Variable-length arguments

Required arguments

必需的参数是以正确位置 顺序传递给函数的参数。在这里,函数调用中的参数个数应与函数定义完全匹配。

Keyword arguments

关键字参数与函数调用相关。在函数调用中使用关键字参数时,调用方通过参数名称识别参数。
这允许你跳过参数或打乱参数顺序,因为Python解释器可以用提供的关键字将值和参数进行匹配。

def printme( str ,num):
   "This prints a passed string into this function"
   print(str*num)
   return
# Now you can call printme function
printme( num=2,str = "My string")

执行结果

My stringMy string

Default arguments

默认参数是假定该参数的函数调用中未提供参数的值。下面的例子对于没传参的age将打印默认值

# 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

Variable-length arguments

在定义函数时,可能需要处理函数的参数数超过指定的参数。这些参数称为变量长度参数,在函数定义中不命名,这与必需和默认参数不同。
语法

def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]

星号 (*) 放置在变量名前,保存所有非关键字参数的值。如果在函数调用期间未指定其他参数,则此元组将保持为空。
示例

# Function definition is here
def printinfo( arg1, *vartuple ):
    "This prints a variable passed arguments"
    print("Output is: ")
    print(arg1)
    for var in vartuple:
        print(var)
    return
# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

执行结果

Output is: 
10
Output is: 
70
60
50

匿名函数

之所以成为匿名函数,是因为声明的时候不用标准的def keyword方式。可以用lambda关键字创建小的匿名函数

  • Lambda形式可以采用任意数量的参数,但是以表达式形式只返回一个值。不能包含命令或多个表达式
  • 匿名函数不能被直接调用来打印,因为lambda需要一个表达式
  • Lambda函数有自己本地的命名空间,不能访问其参数列表外和全局变量外的变量
  • 虽然lambda是那种一行的函数,但与C或C++的内联函数不同,他们是为了性能考虑在函数调用期间传递堆栈分配。

语法

lambda [arg1 [,arg2,.....argn]]:expression

例子

# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2

# Now you can call sum as a function
print("Value of total : ", sum( 10, 20 ))
print("Value of total : ", sum( 20, 20 ))

执行结果

Value of total :  30
Value of total :  40

返回声明

返回声明退出函数,或者返回一个表达式给回调函数。

变量作用域

程序中的所有变量可能无法在该程序的所有位置访问。这取决于声明变量的位置。
变量的范围决定可以访问特定标识符的程序部分。Python中有两种基本变量作用域

  • 全局变量
  • 局部变量
    全局变量 vs. 局部变量
    在函数体内定义的变量具有本地作用域,而外部定义的变量具有全局作用域。
    这意味着只能在声明局部变量的函数中访问局部变量,而全局变量可以由所有函数在整个程序体中访问。调用函数时,其中声明的变量将引入作用域
    例子
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