[python],python函数模块

本文深入解析Python函数的参数传递机制,区分可变与不可变对象,介绍默认参数、关键字参数、不定长参数和匿名函数(lambda表达式),帮助理解函数在实际编程中的运用和技巧。

函数

函数,是一个可以提供代码复用的有效手段

在python中,也是可以定义一些函数的,但是这些函数有着如下的特点:

  1. 以关键字def开头,接着是函数名 + + +参数列表()
  2. 函数体,以:开始,并且缩进
  3. return [表达式],表示结束函数调用,返回给调用放;不带表达式的return 相当于返回None
def Printf(str):
    print(str)

if  __name__ == '__main__' :
    Printf('hello world')

参数的传递

在python中,类型属于对象,我们在函数体重定义的变量是没有类型的

a = [1,2,3]
a = "hello world"
a = 3

上述程序中, [ 1 , 2 , 3 ] [1,2,3] [1,2,3]list类型, h e l l o w o r l d hello world helloworldString类型, 3 3 3Number类型,而变量a是没有类型的,仅仅是对象的一个引用,可以指向listString或者Number类型的对象,都是没有影响的

另外,对于这些类型的对象,又分为可更改的对象不可更改的对象

  1. 可更改的对象,修改对象的值,该变量的引用不发生变化。比如:list,dict
  2. 不可更改的对象,修改对象的值,那么变量所引用的对象也一起发生变化。比如:string ,Number,tuples
print("Number 对象")
a = 3
print("a 的地址 -> ",id(a))
a = 4
print("修改后 a 的地址 -> ",id(a))

print("String 对象")
str = "hello wordl"
print("str 的地址 -> ",id(str))
str = "world hello"
print("修改后 str 的地址 -> ",id(str))

print("list 对象")
list = [1,2,3,4,5]
print("list 的地址 -> ",id(list))
list[2] = 7
print("修改后 list 的地址 -> ",id(list))

在这里插入图片描述
那么,Python在函数传递参数的过程中,就需要注意这两类的对象:

  1. 不可变类型的对象:所传递的只是对象的值,如果发生修改,并不会影响到对象本身
def change(a):
    print(id(a))  # 指向的是同一个对象
    a = 10
    print(id(a))  # 一个新对象


a = 1
print(id(a))
change(a)

在这里插入图片描述

  1. 可变类型的对象:采用引用的方式进行传递,在函数体中修改了对象的值后,在函数外部该对象也会被修改
# 可写函数说明
def changeme( mylist ):
   "修改传入的列表"
   mylist.append([1,2,3,4])
   print ("函数内取值: ", mylist)
   return
 
# 调用changeme函数
mylist = [10,20,30]
changeme( mylist )
print ("函数外取值: ", mylist)

在这里插入图片描述

参数的类型

  1. 必须参数
def function( str ) :
    print(str)

function("hello")

就是我们在调用函数的时候,必须传递一个参数,不然会出现语法错误

    function()
TypeError: function() missing 1 required positional argument: 'str'
  1. 关键字参数
def function( str, a ) :
    print(str,  a)

function(a  = 3,str = "hello")

类似于这样,我们在调用函数的时候,可以不按照函数参数中变量的顺序进行传递,但是必须根据参数名进行匹配参数值

  1. 默认参数
def function( str, a = 5 ) :
    print(str,  a)

function(str = "hello")

可以在参数列表中,显示的为某一个参数附一个默认值,如果在传递参数时,没有指定该变量的值,那么将使用该默认值

在这里插入图片描述
他也满足C++中,如果是半缺省的参数,必须都在参数列表的右侧

  1. 不定长参数
def function( str, *valTuple) :
    print(str)
    print(valTuple)

function( "hello",0,1,2,3,4)
  • 加了星号 ∗ * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
def function( str, *valTuple) :
    print(str)
    print(valTuple)

function(str="hello")

这种情况下,表示不定长参数为一个空元组

在使用不定长参数的时候,就不可以使用关键字参数了
在这里插入图片描述

  • 两个星号 ∗ ∗ ** 的参数会以字典的形式导入
def function( str, **valTuple) :
    print(str)
    print(valTuple)

function(str="hello",a=2,c=3)

在这里插入图片描述

匿名函数

python 中使用lambda来创建匿名函数,也就是说,函数可以不用def来定义了

  1. lambda 只是一个表达式,函数体比 def 简单很多。
  2. lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  3. lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  4. 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

语法

lambda [arg1 [,arg2,.....argn]]:expression

具体的实例:

# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2

# 调用sum函数
print("相加后的值为 : ", sum(10, 20))
print("相加后的值为 : ", sum(20, 20))
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值