Python基础——认识函数(一)

1.函数简介

  • 函数是一个对象
  • 函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次调用
  • 语法:
    def 函数名([形参1,形参2,形参3…]):
       代码块
    注意:
    函数名必须符合标识符的规范(可以包含字母、数字、下划线但是不能以数字开头)
    对某个具体函数来说,不加()是函数对象,加了()才是调用函数,
    例如:print是函数对象 print()是调用函数
# 函数
def my_fun(name):
    # 参数为name,调用时会输出"hello!"加上输入的参数
    print('hello!', name)


print(my_fun)           #<function my_fun at 0x000001DA9CAB9620>
my_fun('Nathaniel')     #hello! Nathaniel

2.函数的参数

2.1 形参和实参

  • 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值
  • 实参(实际参数)指定了形参,那么在调用函数时必须传递实参,实参将会赋值给对应的形参,简单来说有几个形参就要有几个实参
# 函数的参数
# 形参和实参
def my_fun(name):
    # 函数的name即为形参
    print('hello!', name)
# 调用函数是输入的实际参数就是实参,这里的'Nathaniel'就是实参
my_fun('Nathaniel')  # hello! Nathaniel

# 形参改变并不会影响实参  
def my_fun2(name):                         
    name = 'Tom'               
    print('hello!', name)                      
name = 'Nathaniel'             
my_fun2(name)  # hello! Tom    
print(name)   # Nathaniel      

# 多参数函数
def my_funs(name1, name2):
    # 函数的name即为形参
    print('hello!', name1, 'and', name2)
# 当传递两参数时
my_funs('Tom','Jerry')      #hello! Tom and Jerry
# 当只传入一个参数时,会出错,即形参和实参的数量需要对应相等
my_funs('Tom')              #TypeError: my_funs() missing 1 required positional argument: 'name2'

2.2 函数的传递方式

  • 定义形参时,可以为形参指定默认值。指定了默认值以后,如果用户传递了参数则默认值不会生效。如果用户没有传递,则默认值就会生效
  • 位置参数:位置参数就是将对应位置的实参赋值给对应位置的形参
  • 关键字参数 : 关键字参数可以不按照形参定义的顺序去传递,而根据参数名进行传递
  • 混合使用位置参数和关键字参数的时候必须将位置参数写到关键字参数前面去
# 函数的参数
# 函数的传递方式
def example_fun(name1,name2,name3 = 'Nathaniel'):
    # 为第三个参数赋予了初值,即设置了默认值
    print('Hello!',name1)
    print('Hello!',name2)
    print('Hello!',name3)

# 当只传递了两个参数,函数不会报错,且会采用默认值
example_fun('Tom','Jerry')
# Hello! Tom
# Hello! Jerry
# Hello! Nathaniel

#当传递三个参数时,默认值将会被覆盖,输出传入的参数
example_fun('Tom','Jerry','Tony')
# Hello! Tom
# Hello! Jerry
# Hello! Tony

# 关键字参数
# 当输入的参数包含了关键字,即函数参数名,函数会按照关键字的位置进行传递
example_fun(name1 = 'Tom',name3 = 'Jerry',name2 = 'Tony')
# Hello! Tom
# Hello! Tony
# Hello! Jerry

# 位置参数与关键字参数混合
# 位置参数需在关键字参数前面
example_fun(name3 = 'Tom','Jerry',name2 = 'Tony')       #SyntaxError: positional argument follows keyword argument
example_fun('Jerry',name3 = 'Tom',name2 = 'Tony')
# Hello! Jerry
# Hello! Tony
# Hello! Tom

3.不定长参数

  • 定义函数时,可以在形参前面加一个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到一个元组中
  • 带*号的形参只能有一个,可以和其他参数配合使用
  • *形参只能接受位置参数,不能接受关键字参数
  • **形参可以接收其他的关键字参数,它会将这些参数统一保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
  • **形参只有一个,并且必须写在所有参数的后面
# 不定长参数                                                                                                                  
# 在形参前面加一个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到一个元组中                                                                            
def next_fun1(num1,num2,*num):                                                                                           
    print(num1,num2,num)                                                                                                 
    print(type(num))                                                                                                     
                                                                                                                         
next_fun1(2,3,4,5,6,7)                                                                                                   
# 2 3 (4, 5, 6, 7)                                                                                                       
# <class 'tuple'>                                                                                                        
                                                                                                                         
# 带*号的形参只能有一个,可以和其他参数配合使用                                                                                                
def next_fun2(num1,*num,num2):                                                                                           
    print(num1,num2,num)                                                                                                 
    print(type(num))                                                                                                     
# 当带*的形参位置在其他形参的前面时,它会将后面传递的参数全部传入自己的元组中,所以必须为其后面的形参指定关键字                                                                
# next_fun2(2,3,4,5,6,7)              # TypeError: next_fun2() missing 1 required keyword-only argument: 'num2'          
next_fun2(2,3,4,5,6,num2 = 7)                                                                                            
# 2 7 (3, 4, 5, 6)                                                                                                       
# <class 'tuple'>                                                                                                        
                                                                                                                         
                                                                                                                         
# **形参可以接收其他的关键字参数, 它会将这些参数统一保存到字典当中                                                                                     
# 字典的key就是参数的名字, 字典的value就是参数的值                                                                                          
def next_fun3(num1,num2,**num):                                                                                          
    print(num1,num2,num)                                                                                                 
    print(type(num))                                                                                                     
next_fun3(2,3,num = 4567)                                                                                                
# 2 3 {'num': 4567}                                                                                                      
# <class 'dict'>                                                                                                                                                                                                        

4.参数的解包

  • 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
  • 要求序列中的元素的个数必须和形参的个数一致
# 参数的解包                           
def get_num(num1, num2, num3):    
    print(num1, num2, num3)       
                                  
                                  
get_num(*'abc')            #a b c 
get_num(*['d', 'e', 'f'])  #d e f 
get_num(*('g','h','i'))    #g h i 
发布了14 篇原创文章 · 获赞 23 · 访问量 873

猜你喜欢

转载自blog.csdn.net/qq_46147573/article/details/105707980