Python学习第三天

本文详细讲解了Python函数的深入理解,包括默认参数的使用、参数的灵活性(位置参数与关键字参数,以及可变参数的星号*和**),以及列表作为默认参数的注意事项。通过实例展示了函数调用的不同方式和技巧,如拆解元组与字典。
摘要由CSDN通过智能技术生成

函数

深入函数

默认参数

声明一个具有参数的函数形式如下所示:

def <函数名> (参数=默认值):

<语句>

参数传递

提供关键字参数调用函数时,要在调用函数名后的圆括号里写出形 式为“关键字=参数值”的参数,这样,调用函数时提供参数就不必严格 按照该函数声明时的参数列表的顺序来提供调用参数了。如果在函数调 用时,既提供了关键字参数,又提供了位置参数,则位置参数会被优先 使用,如果参数结合时出现重复,则会发生运行错误。

如:

hello (name = "Jonson")

hello(name = "Jonson" , hi = "hi")
注:调用函数提供参数时,按顺序传递的参数要位于关键字参数之 前,而且不能有重复的情况。

一般来说,定义的函数如果既有无默认值的函 数,又有有默认值的函数,应当把有默认值的参数放在后面。这样在调 用函数时,前面的无默认值的参数就可以依次序取得调用时所给的值。 对于默认值参数,没有依次取得时,就使用默认值,给函数调用带来很 大的方便。

可变数量参数传递

在自定义函数时,如果参数名前加上一个星号“*”,则表示该参数 就是一个可变长参数。在调用该函数时,如果依次序将所有的其他变量 都赋予值之后,剩下的参数将会收集在一个元组中,元组的名称就是前 面带星号的参数名.

【实例5-5】演示了自定义一个只有一个带星号的参数的函数 实例,代码如下:

def change_para_num (*tp1):      
    print (type (tp1))             #输出tp1变量的类型      
    print (tp1)
  change_para_num (1)   
    change_para_num (1,2,3)

【代码说明】代码中定义了一个函数change_para_num(*tpl),它只有一个带星号参数的函数。

【运行效果】如图5.5所示,两次调用第一行输出类型为tuple,即 元组;第一次调用时只有一个参数,元组中也只有一个值;第二次调用 时有三个参数,全部收集到了tpl变量中。

使用元组来收集参数的参数时,调用时提供的参数不能为关键字参 数,如果要收集不定数量的关键字参数可以在自定义函数时的参数前加 两颗星即**valuename,这样一来,多余的关键字参数就可以以字典的 方式被收集到变量valuename之中。

【实例5-6】演示了一个同时有三种类型的参数的函数定义及 调用,代码如下:

def change_para_num(*tpl,a,b=0):      
    print('tp1:',tp1)      
    print('a:',a)      
    print ('b:',b)

    change_para_num (1,2,3,a=5)   
    change_para_num(1,2,3)             #该调用会出错,a变量没有默认值,

拆解序列的函数调用

实际 上调用函数时还可以把元组和字典进行拆解调用。

  1. 拆解元组提供位置参数;
  2. 拆解字典提供关键字参数。

调用时使用拆解元组的方法是在调用时提供的参数前加一个*号; 要拆解字典必须在提供的调用参数前加两个*号。

【实例5-9】演示了拆解元组的函数调用,代码如下:

    def mysum (a,b):      
    return a+b

    print ('拆解元组调用:')   
    print (mysum(* (3,4)))              #调用时拆解元组作为位置参数   
    print ('拆解字典调用:')   
    print (mysum(**{'a':3, 'b':4})      #调用时拆解字典作为关键字参

【运行效果】如图5.9所示,两种调用的结果是相同的。

函数调用时参数的传递方法

列表、字典是可变对象,它在作为函数的默认参数时要注意一 个“陷阱”。 

【实例5-11】演示了使用列表作为默认参数时出现的“陷阱”, 代码如下:
 

def myfun (lst= []):       #定义有一个默认值为空列表的参数      
    lst.append('abc')      
    print (lst)

    myfun()                     #此后三次调用自定义函数   
    myfun()   
    myfun()

【代码说明】代码中只定义了一个带有空列表默认参数的函数 myfun(),然后在不提供参数的情况下调用了三次这个函数。
【运行效果】如图5.11所示,每次调用函数按默认值的理解,应该 每次传入空列表,列表中只有一个元素'abc',但事实不是如此,结果如 图:

如果要实现空列表的默认参数,可以修改函数代码如下:

def myfun (lst=None):       #定义有一个默认值为空列表的参数      
    lst = [] if lst is None else lst      
    lst.append('abc')      
    print (lst)

变量的作用域

在Python中,作用域可以分为:

  • 内置作用域:Python预先定义的;
  • 全局作用域:所编写的整个程序; =>global 
  • 局部作用域:某个函数内部范围。

使用匿名函数(lambda)

lambda可以用来创建匿名函数,也可以将匿名函数赋给一个变量供 调用,它是Python中一类比较特殊的声明函数的方式,lambda来源于 LISP语言,其语法形式如下:

lambda params:expr

其中params相当于声明函数时的参数列表中用逗号分隔的参数, expr是函数要返回值的表达式,而表达式中不能包含其他语句,也可以 返回元组(要用括号),还允许在表达式中调用其他函数。

import math   
s = lambda xl, yl, x2, y2:math. sqrt( (xl-x2) **2+(yl-y2) **2)  
s(1,1,0,0)   #结果为1.4142135623730951

lambda一般用来定义以下类型的函数:

  • 简单匿名函数 写起来快速而简单,省代码;
  • 不复用的函数 在有些时候需要一个抽象简单的功能,又不想单独定义一个函数;
  • 为了代码清晰 有些地方使用它,代码更清晰易懂。

比如在某个函数中需要一个重复使用的表达式,就可以使用lambda 来定义一个匿名函数,多次调用时,就可以少写代码,但条理清晰。

Python常用內建函数

常用內建函数
dir(obj)列出对象的相关信息
help(obj)显示对象的帮助信息
bin(aint)十进制数转化为二进制的字符串形式
hex(aint)十进制数转换为十六进制数的字符串形式
oct(aint)十进制数转换为八进制数的字符串形式
callable(obj)测试对象是否可调用(函数)
chr(aint)ascii码转为字符
ord(char)将字符转为ascii码
filter(seq)对序列中的数据用函数过滤
map(seq)对序列中的数据逐个变换
isinstance(obj,typestr)测试对象是否为某类型

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值