点我

作用:代码的复用

基本语法

函数语法格式:

def   函数名([参数列表]):
    '''注释'''
    函数体

注意事项

  1. 不需要说明形参的数据类型,python解释器会根据实参的值自动推断形参类型
  2. 不需要指定函数返回值类型,由函数中return语句返回的值来确定
  3. 函数即使不需要接收任何参数,也必须保留一对空的圆括号
  4. 函数括号后面的冒号:必不可少
  5. 函数体相对于def关键字,必须保持一定的空格缩进

函数调用

函数名([实参列表])

>>> def d(a,b,c):
    print(a,b,c)

    
>>> d(1,2,'a')

>>> def demo():
    x = 10
    y = 10
    print(x,y)
    
>>> demo()
10 10

函数返回值

返回值是函数在完成工作后,最后给调用者的一个结果

在函数中使用关键字return 返回结果

return 表示返回,后续的代码都不会被执行

>>> def sum_2(num1,num2):
    return num1 + num2

>>> res = sum_2(10,40)
>>> print("结果为{}".format(res))
结果为50

函数嵌套

在函数中调用函数

def test1():
    print('*' * 10)

def test2():
    print('-' * 10)
    test1()

test2()

递归函数

递归调用:在一个函数中直接或间接地调用函数自身(函数在内部调用函数本身)

在编写递归函数时,应注意以下几点:

  1. 每次递归应保持问题性质不变
  2. 每次递归应使用更小或更简单的输入
  3. 必须要保证递归过程可以结束
  4. 函数递归深度不能太大,否则会引起内存崩溃

函数参数

函数可以有多个形参,使用逗号隔开,也可以没有形参,但圆括号必须要有,表示这是一个函数并且不接收参数

调用函数时向其传递实参,将实参的引用传递给形参

位置参数

调用函数时,实参和形参的顺序必须严格一致,并且实参和形参的数量必须相同

>>> def d(a,b,c):
    print(a,b,c)

    
>>> d(1,2,'a')
1 2 a
>>> d(1,2)
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    d(1,2)
TypeError: d() missing 1 required positional argument: 'c'
>>> d(1,2,3,4)
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    d(1,2,3,4)
TypeError: d() takes 3 positional arguments but 4 were given
>>> d(3,2,1)
3 2 1

默认值参数

可以为形参设置默认值

在调用带有默认值参数的函数时,可以不为设置了默认值的形参进行传参

在定义带有默认值参数的函数时,任何一个默认值参数右边都不能再出现没有默认值的普通位置参数,否则会提示语法错误

语法:def (....,形参名=默认值):函数体

>>> def b(a,b,c=2):
    print(a,b,c)

    
>>> b(3,'a')
3 a 2

如果对设置了默认值的参数传参,将不再使用默认值,而是使用调用者显式传递的值

>>> b(3,'a','b')
3 a b

可变长度参数

  • 参数长度不固定,可以为0个或者多个
  • 使用多个参数以逗号分开
  • 接收任意多个位置实参并将其放在一个元组中
  • 定义时 使用 *参数名的形式
  • 调用时 使用多个参数时以逗号隔开或者*参数名的形式
>>> def demo(*p):
    print(p)

    
>>> demo(1,2,3,4,5,'a')
(1, 2, 3, 4, 5, 'a')
>>> demo(1,2)
(1, 2)

例子:求各参数的平方
def calc(*nums):
       sum = 0
       for i in nums:
              sum = sum +i * i
       return sum

>>> calc(1,2)
5

关键字参数

  • 参数长度不固定,可以为0个或者多个
  • 所有参数以字典的格式传入
  • 定义时 形参使用 **参数名 的形式
  • 调用时 使用 key=value 的方式 或者 **参数的形式
def introduce(name,gender,**kw):

    #print(kw)

    print("我是{},一个{}生,其他信息{}".format(name,gender,kw))

#调用

introduce("李四","女",age=19,city="成都")

introduce("李四","女",age=19,city="成都",state ="singledog")

#结果
我是李四,一个女生,其他信息{'age': 19, 'city': '成都'}
我是李四,一个女生,其他信息{'age': 19, 'city': '成都', 'state': 'singledog'}

命名关键字参数

  • 当希望对关键字参数进行限制时,只要接受某几个key作为关键字参数
  • 定义时,用一个*单独作为参数,后面的所有参数都是规定好的关键字参数(如函数定义中已经有一个可变参数,后面跟着的命名关键字参数就不需要*了)
  • 调用时,必须使用key=value模式,而且key必须是定义时的key

注意:命名关键字参数可以有缺省值,从而简化调用

def introduce1(name,gender,*,age,city):
    print("我是{},一个{}生,今年{}岁,家住{}".format(name,gender,age,city))

#调用
introduce1('zs','男',age=20,city='北京')
我是zs,一个男生,今年20岁,家住北京

#调用时还是以参数名=参数值,但可以不写有默认值的参数,如列表的sort方法
def introduce2(name,gender,*,age=18,city="成都"):
    print("我是{},一个{}生,今年{}岁,家住{}".format(name,gender,age,city))

#调用
introduce2('zs','女')
我是zs,一个女生,今年18岁,家住成都、


#如果和可变参数结合,命名关键字参数必须放到可变参数后面
#而且需要去掉命名关键字参数自带的那个*,如print方法
def introduce3(name,gender,*args,age=18,city="成都"):
    print("我是{},一个{}生,其他信息{},今年{}岁,家住{}".format(name,gender,args,age,city))

#调用
introduce3('zs','男女')
我是zs,一个男女生,其他信息(),今年18岁,家住成都

参数组合

以上5中参数可以在函数定义时组合使用

参数定义的顺序必须是:位置参数、默认参数、可变参数、命名关键字参数和关键字参数

如果定义一个 func(args, *kw)的形式的函数,调用时无论传入什么参数都是可以的

变量作用域

变量起作用的代码范围称为变量的作用域,不同作用域内的同名变量之间互不影响

如果想要在函数内部修改一个定义在函数外的变量值,必须使用 global 明确声明,否则会自动创建新的局部变量

>>> def demo():
    x = 10
    y = 10
    print(x,y)

>>> x = 5
>>> x
5
>>> demo()
10 10
>>> x
5



>>> def demo1():
    global x 
    x = 10
    y =10
    print(x,y)

    
>>> x
5
>>> demo1()
10 10
>>> x
10
分类: Python

评论

-- 评论已关闭 --

目录