Python基础教程(12)函数与参数

Tanglu Python 2019-12-12 3136 0

一、什么是函数

函数就是执行特定任务以完成特定功能的一段代码。这一段代码被定义为一个函数后可以重复调用,增强代码复用率。在调用函数的时候接收到的输入信息被称为参数,在结束调用后输出的信息被称为返回值


二、Python函数的定义与调用

· 定义无参数函数

def 函数名(); 
  代码块
  [return 返回值]  #如果没有return的话返回None
  
#示例
def printInfo():
  print("真的太难了")


· 定义有参数函数

def 函数名(参数1,参数2,...);
  代码块
  
#定义有参数函数示例
def printinfo(text):
  print(text)
  
printinfo("真的太难了")


· 调用函数

如果给形参设置的默认值是一个可变类型,比如列表,然后在调用函数时修改了形参的默认值,那么后续再调用该函数时,形参的默认值将会是修改后的值。如果要避免这种情况,可以将形参默认值定义为None

#调用函数
printInfo()  #输入函数名即可完成调用

#重复调用该函数时,names参数的默认值会发生变化
def fun1(names=[]):
  names.append('tanglu')
  print(names)
fun1()  #输出[tanglu]
fun1()  #输出[tanglu,tanglu]
fun1()  #输出[tanglu,tanglu,tanglu]

#
def fun2(names = None):
  if names is None:
   names = []
  names.append('tanglu')
  print(names)
fun2()  #输出[tanglu]
fun2()  #输出[tanglu]
fun2()  #输出[tanglu]


三、函数的参数类型与介绍

参数类型分了多种,如果一个函数中同时存在多种参数,那么书写顺序一定要注意

· 可变参数必须定义在普通参数以及默认值参数的后面

· *args需要在**kwargs前面

· 关键字参数放在最后

# 书写顺序示例
# def abc(普通参数,默认值参数,*参数,**参数)
def abc(a,name='tanglu',*args,**kwargs):
  print(a)
  print(name)
  print(args)
  print(kwargs)
abc(100,"唐路",1,2,3,x=100,y=200)  

# 100
# 唐路
# (1, 2, 3)
# {'x': 100, 'y': 200}


1、普通参数

函数调用时需要根据函数定义时要求的形参(形式参数,在定义函数时定义的参数就是形参)去传递对应的实参(即实际参数,是调用函数时传递的参数),实参可以是多种数据类型,但是传递参数时的位置需要和形参对应,且实参个数必须和形参严格匹配

def calc(num1,num2)        #定义calc函数时定义了2个形参
  result = num1 + num2
  print(result)

calc(10,20)                
calc(num2=5,num1=2)        #也可以通过关键字指定实参的值,不用强行按照形参的顺序来定义,更灵活


2、默认参数

如果代码中有大量参数的最终值可能都是相同的,可以使用默认参数的形式减少代码量。默认参数就是提前为参数设置一个默认值,在调用参数的时候可以不再去为该参数传递任何的数据,如果在实参里又定义了值,那么则覆盖默认参数的值。由于默认参数后面只能是默认参数,所以在定义和调用默认参数时要把默认参数放在后面,不要穿插有形参

def abc(a=300,b=400)
  print(a+b)

abc()   #使用默认参数的值  
abc(b=1000)  #指定一个默认参数进行传值
abc(600,300)  #使用传递的参数覆盖默认参数
abc(500)  #为第一个默认参数传值


def student_info(name,sex,age,school='清华大学'):    #为school参数设置了默认值
student_info('张三','男','7')                        #这里只传递了3个参数,因为school有默认值,可以不写


3、可变参数

在参数个数未明确,而是需要根据用户传递的数量来确定的时候,可以使用可变参数来实现。可变参数可以通过*或**来表示,后面的关键词可以自定义,但是约定俗成一般使用的是*args和**kwargs。*args是将多个参数收集到一个元组中、**args是将多个参数收集到一个字典中

def get_sum(*args):    #定义了一个可变参数
    print(args) 
get_sum(1,2)              #以元组形式输出1,2
get_sum(1,2,3)           #以元组形式输出1,2,3
get_sum()                   #也可以不传递任何参数

#使用可变参数时经常会涉及装包与拆包操作,赋值时是装包过程,调用时是拆包过程
nums = (12,4,5,1)   #这里传递了一个元组作为参数,在传参时使用*号调用就完成了拆包
my_sum(*nums)

*y = 4,6,8
print (y)    #结果是[4,6,8]

t1=(9,4,8,6)
x,*y = t1
print (x,y)  #x=9,y=[4,8,6]


def show_book(**args):
    print(args)
    
show_book(bookname='西游记',author='吴承恩')  #两个*号的参数必须传递字典类型的数据
book = {bookname='红楼梦',author='曹雪芹'}
show_book(**book)     #将已有字典拆包传递给函数


4、命名参数(关键字参数

如果是在可变参数后面还存在参数,那么在调用函数的时候必须使用命名参数来传递数据

def test_fun(a,b,c=3,*args,name):
    print(a,b,c)
    print(args)
    print(name)

test_fun(1,2,4,5,6,7,name="tanglu")
# 输出结果
1 2 4
(5, 6, 7)
tanglu


四、函数返回值

· Python中的函数可以使用return返回数据,如果未使用的话默认返回的是None值

· 返回值的作用就是在执行函数以后返回一个结果,这个结果可以在其他地方进行调用,否则函数外部的代码想要调用函数内的数据会出错

· 在函数体中return之后的代码以及函数本身都会被结束

· return可以返回多个数据并封装在一个元组中

#一个函数中的代码块可能存在多个任务,如果想指定最终返回结果,需要用return
def worker(a, b, c):
    x = a + b  #函数完成了动作1,即a + b
    y = x * c  #函数完成了动作2,即x * c
    return y      #指定函数只返回动作2的结果
    
num = worker(1, 2, 3)  #需要使用一个变量接收函数的返回值
print(num)  #返回为9,(a+b)*c


五、函数变量的作用域

在函数中定义的变量默认为局部变量 ,在函数A中定义了变量var1,在函数中B也可以定义一个变量var1。如果要让函数中去调用或者修改全局变量需要使用关键词global(只有内存地址不可变的数据类型才需要添加global关键词,包括int、str、float、bool、tuple),而对于可变类型的数据(数据发生变化但是内存地址不变)可以不用加global。使用函数引用全局变量时需要注意变量一定要先于引用前定义好,否则会出现找不到变量的错

def test1():
  a = 10
  print(a)

def test2():
  a = 20 
  print (a)

def test3()
  global b = 10  #全局变量

test1()  #输出10
test2()  #输出20


2、函数可以嵌套函数,内部函数可以引用外部函数的变量,如果要修改外部函数的变量需要通过nonlocal关键词修改,在引用外部函数变量或者全局变量时内部就不能再定义同样的变量,否则会冲突。在嵌套函数结构中,如果内部函数引用了外部函数的变量且最终返回值是内部函数,那么属于闭包

def outer():
  a = 100
  def inner():
    b = 200
    print('我是内部函数:',b)
    b += a            
    print(b)
  print(a)
  inner()

outer()


3、一个函数接收另一个函数作为参数,那么这个函数是高阶函数


六、函数参数解包

使用*号可以对传入的参数进行解包操作

#对字符串解包
string = "abc"
def abc(a,b,c):
    print(a)
    print(b)
    print(c)
abc(*string)  #输出a,b,c

#对列表\元组\集合解包时元素要和参数个数对应,不能多也不能少
list = [1,2,3]
def abc(a,b,c):
    print(a)
    print(b)
    print(c)
abc(*list)

#对字典解包的话输出的是key,如果需要输出value的话是用两个星号**,并且定义的参数要和字典里的key是一样的
dic = {"name":"tanglu","age":18,"height":175}
def abc(a,b,c):
    print(a)
    print(b)
    print(c)
abc(*dic)   #输出name,age,height

dic = {"name":"tanglu","age":18,"height":175}
def abc(name,age,height):
    print(name)
    print(age)
    print(height)
abc(**dic)   #输出tanglu,18,175


七、Python中的程序入口函数(main函数)

main函数是Python代码的执行入口,Python会从main函数标记的位置开始执行程序。这个入口在一个程序中通常是唯一的,用于说明整个程序是从哪个文件或者哪个部门开始执行。虽然Python没有严格要求必须存在代码入口,但是为了规范的话建议开启。在Python程序中对于main函数的写法格式如下

if __name__ == '__main__':

评论