Python programming 8


基础永远值得花费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

文章作者: Enomothem
版权声明: 本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Enomothem !
  目录