函数里面的基本概念,小笔记录下来~
python中函数定义中的变量叫做形参;函数调用中的变量叫做实参
站在形参的角度:1.位置参数;2.默认值参数;3.混合参数:位置参数在前,默认值参数在后
站在实参的角度:1.位置参数;2.关键字参数;3.混合参数:位置参数在前,关键字参数在后
总结要点写在前面,下面一一填坑。
- 位置参数
分为位置形参与位置实参,鉴于函数定义中常有多个位置形参,因此函数调用中也常有多个位置实参。所以重点来了,在只有位置参数的时候,需要实参与形参的顺序一一对应即相同顺序。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def func(name, food):#name与food为函数定义中的位置形参
print(name + " eat " + food + "!")
func("akai", "noodles") #位置实参,按记住形参含义,按顺序一一对应
func("noodles", "akai") #位置实参不按顺序,则会出问题
#akai eat noodles!
#noodles eat akai! #不按顺序闹笑话
- 默认值参数
全名默认值形参,在编写与定义函数时可以给每个形参定义默认值。在函数调用时如果给形参提供了实参(关键字实参数),python将使用指定的实参值;否则,将使用形参的默认值
def func(food = "noodles"):#默认值形参
print("akai eat "+food)
func()#没改变直接调用默认值参数
func(food = "beef")#给形参提供实参,改变默认值,这里剧透下叫做关键字实参
#akai eat noodles
#akai eat beef
- 形参中的混合参数
上述的例子都只是含有单一的形参,要是两个混合在一起,不按规矩来就会乱套,所以有了混合形参中的法则:位置参数在前,默认值参数在后。但其实,在混合参数中,默认值参数依然是被作为位置参数来看待的。
def func(name, food="noodles"):#位置形参在前,若是在后就会报错
print(name + " eat " + food +"!")
func("akai")
func("akai",food="beef")
func("akai","beef")#没有写成关键字参数,不影响它被看做是位置参数的本质
func(food="beef",name="akai")#见下,关键字参数
#akai eat noodles!
#akai eat beef!
#akai eat beef!
#akai eat beef!
- 关键字参数
关键字实参是传递给函数名称——值对。你直接在实参中将名称和值关联起来了,因此向函数传递实参时不会混淆。有一个好处就是:无需考虑函数调用中的实参顺序,还清楚的指明了函数调用中各个值的用途。关键字参数之间不存在顺序!
def func(name, food):
print(name + " eat " + food + "!")
func(name= "akai", food= "beef")
func(food= "noodles", name= "akai")#关键字参数的顺序无关紧要
#akai eat beef!
#akai eat noodles!
- 实参中的混合参数
在混合形参中已经有所展示了,牢记:位置实参在前,关键字实参在后;关键字参数无先后
- 一道题目
如果默认值参数变成一个可变的数据类型,如列表,字典。
def func(val, list=[]):
list.append(val)
return list
list1 = func(10)
print('list1= {0}'.format(list1))
list2 = func(20, [])
print('list2= %s' % list2)
list3 = func('a')
print('list3= %s' % list3)
#题目答案
#list1= [10]
#list2= [20]
#list3= [10, 'a']
解释:1.默认值参数在函数定义时就已经算出来了,而不是在函数运行时;2.默认值参数是一个可变的数据类型,那么如果有人调用它的时候改变了它,其他位置用到也跟着改变。
解决方案:1.每次调用,像例子中调用函数2一样,位置参数跟一个空列表;2.不在形参中加入可变数据类型一类的默认值参数,要创建空列表的话,在函数体内创建。
提前占个动态参数*args,**args的坑,以后填上!
如有错误,欢迎指正!