【Python】从入门到上头—函数(3)

一.什么是函数

  • 函数可重用的代码块,在java中又称为方法
  • 函数分为内置函数,即Python自带的如数,比如 input() 、print()、range()、len() 函数等等,这些都是 Python 的内置函数,可以直接使用。
    • 也可以自己创建函数,即将一段有规律的、可重复使用的代码定义成函数,从而达到一次编写、多次调用的目的。这被叫做用户自定义函数

二.如何定义函数

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,

  • def 关键词开头,后接函名称和圆括号 () ,括号中的参数和 冒号:
  • 函数的返回值用return语句返回。,没有return默认返回 None。
    def 函数名(参数列表):
    	函数体
    

实例:比较两个数,并返回较大的数:

def max(a, b):
    if a > b:
        return a
    else:
        return b
 
a = 4
b = 5
print(max(a, b))

三.函数调用

  • 正常调用
# 定义函数
def printme( str ):
   # 打印任何传入的字符串
   print (str)
   return
 
# 调用函数
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")

参数类型

  • 在 python 中,变量是没有类型的
    • 必需参数
    • 关键字参数
    • 默认参数
    • 不定长参数

必需参数

  • 须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
    • 调用 printme() 函数,你必须传入一个参数,不然会出现语法错误:
#可写函数说明
def printme( str ):
   "打印任何传入的字符串"
   print (str)
   return
 
# 调用 printme 函数,不加参数会报错
printme()

报错

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    printme()
TypeError: printme() missing 1 required positional argument: 'str'

关键字参数

  • 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
def printinfo( name, age ):
   "打印任何传入的字符串"
   print ("名字: ", name)
   print ("年龄: ", age)
   return
 
#调用printinfo函数
printinfo( age=50, name="runoob" )

默认参数

  • 调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:
#可写函数说明
def printinfo( name, age = 35 ):
   "打印任何传入的字符串"
   print ("名字: ", name)
   print ("年龄: ", age)
   return
 
#调用printinfo函数
printinfo( age=50, name="runoob" )
print ("------------------------")
printinfo( name="runoob" )

不定长参数
需要能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。

  • 基本语法如下:

    def functionname([formal_args,] *var_args_tuple ):
       "函数_文档字符串"
       function_suite
       return [expression]
    
  • 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

  • 结果:

    输出: 
    70
    (60, 50)
    

如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量

  • 实例:

    # 可写函数说明
    def printinfo( arg1, *vartuple ):
       "打印任何传入的参数"
       print ("输出: ")
       print (arg1)
       for var in vartuple:
          print (var)
       return
     
    # 调用printinfo 函数
    printinfo( 10 )
    printinfo( 70, 60, 50 )
    
  • 结果

    输出:
    10
    输出:
    70
    60
    50
    

还有一种就是参数带两个星号 **基本语法如下:

  • 加了两个星号 ** 的参数会以字典dict的形式导入。

    def functionname([formal_args,] **var_args_dict ):
       "函数_文档字符串"
       function_suite
       return [expression]
    
  • 实例

    # 可写函数说明
    def printinfo( arg1, **vardict ):
       "打印任何传入的参数"
       print ("输出: ")
       print (arg1)
       print (vardict)
     
    # 调用printinfo 函数
    printinfo(1, a=2,b=3)
    
  • 结果

    输出: 
    1
    {'a': 2, 'b': 3}
    

声明函数时,参数中星号 * 可以单独出现,例如:

def f(a,b,*,c):
    return a+b+c

如果单独出现星号 *,则星号 * 后的参数必须用关键字传入:

>>> def f(a,b,*,c):
...     return a+b+c
... 
>>> f(1,2,3)   # 报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 3 were given

>>> f(1,2,c=3) # 正常
6
>>>

四.匿名函数

Python 使用 lambda 来创建匿名函数。

  • 所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数

语法 lambda 函数的语法只包含一个语句,如下:

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

实例:设置参数 a 加上 10:

x = lambda a : a + 10
print(x(5))

实例 匿名函数设置两个参数

# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2
 
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))

可以将匿名函数封装在一个函数内,这样可以使用同样的代码来创建多个匿名函数。

  • 实例:将匿名函数封装在 myfunc 函数中,通过传入不同的参数来创建不同的匿名函数:

    def myfunc(n):
      return lambda a : a * n
     
    mydoubler = myfunc(2)
    mytripler = myfunc(3)
     
    print(mydoubler(11))
    print(mytripler(11))
    

猜你喜欢

转载自blog.csdn.net/qq877728715/article/details/132475894