【python基础】python中的函数

1. 函数的定义与调用

函数的定义形式如下

def 函数名(参数1,参数2....参数n):
    函数体
    return 语句

说明:

  • def:表示定义一个函数,后接函数标识符名称和圆括号()
  • 参数列表可填可不填,根据需要定。
  • 函数的第一行语句可以选择性地使用文档字符串(用于存放函数说明)
  • 函数体:表示函数的执行的功能
  • return:函数的返回结果,不带表达式的 return 相当于返回 None

例下程序,定义一个函数,功能为传入两个参数并返回两者之和,并对该函数进行使用。

def sum(num1,num2):
	"计算两数之和" #----函数说明
	return num1 + num2

#调用
sum(1, 3) # 计算1 + 3

2. 函数的参数

2.1 默认参数

(1)默认参数的定义

在构建函数的时候,用"="号给某个或某几个参数默认值,我们就称它为默认参数。下面代码中的sex就是默认参数。

def person( name , age , sex = '男' ):
    # 打印用户信息
    print("name: ",name)
    print("age: ",age)
    print("sex: ", sex)

# 调用 person 函数

person( '张三' , 18 , '女') 
person( '李四' , 25 ) # sex用的是默认参数

输出:

name:  张三
age:  18
sex:  女
name:  李四
age:  25
sex:

(2)默认参数只能在尾部

def func(a, b=1) 是有效的,但是 def func(a=1, b) 是无效的,例如下列代码会报错

def person(sex = '男', name , age):
    # 打印用户信息
    print("name: ",name)
    print("age: ",age)
    print("sex: ", sex)

(3)列表和字典的默认参数

默认参数的值是不可变的对象,比如None、True、False、数字或字符串。列表和字典的默认参数可以用None作为默认值,例如:

def person( a , b = None ):
    if b is None :
        print("None")
    else:
        print("b is :",b)
    return;

person(3,{12,13,14})

输出:

b is : {12, 13, 14}

注意默认参数不要用[],尽管程序不报错,但是因为列表为可变类型,所以多次调用后,可能会修改列表的值,导致结果错误。例如:

def print_info( a , b = [] ):
    print(b)
    return b ;

result = print_info(1)

result.append('error')

print_info(2) # b已经被改变,输出['error']

输出:

[]
['error']

(4)使用默认参数判断是否有值传入

有时候,只是想单单判断默认参数有没有值传递进来,可以使用object 类的实例,因为object 是 python 中所有类的基类,但是这些实例没什么实际用处,因为它并没有任何有用的方法, 也没有任何实例数据(因为它没有任何的实例字典,你甚至都不能设置任何属性值)。正好利用这一点,可以测试有没有值传入。

_no_value =object()

def print_info(a,b = _no_value ):
    if b is _no_value :
        print('b 没有赋值!')
    else:
        print("b 有赋值!")
    return;
print_info(3,[1,3,4,5])

输出:

b 有赋值!

2.2 关键字参数(位置参数)

(1)关键字参数的使用

关键字参数不需要考虑参数的位置,在python中,只需要在调用函数时,带上参数名一起传入即可。

例如:

def person( name , age , sex = '男' ):
    # 打印用户信息
    print("name: ",name)
    print("age: ",age)
    print("sex: ", sex)

# 调用 person 函数
person( age = 30, name = '张三' ) 

输出:

name:  张三
age:  30
sex:

(2)强制关键字参数

如果需要让调用函数时候,必须使用关键字参数,可以在某个参数前面添加*,号即可。比如下列中sex和hobby都必须为关键字参数

def person( name , age , *, sex = '男' ,hobby):
    # 打印用户信息
    print("name: ",name)
    print("age: ",age)
    print("sex: ", sex)
    print("hobby: ",hobby, type(hobby))

# 调用 person 函数
#person('张三',30,"女") #报错,sex和hobby必须用关键字参数
#person('张三',30,sex = "女") #报错,hobby必须为关键字参数
person('张三',30,sex = "女",hobby="书法") #sex和hobby都以关键字参数传入

输出:

name:  张三
age:  30
sex:  女
hobby:  书法 <class 'str'>

2.3 不定长参数

(1)元组类型的不定长参数

有时候并不确定传入参数的个数,只需要在参数前面加一个*号,就表示它是不定长参数。在函数体内部被*号修饰的参数为tuple类型。

如果输入的为一个list和tuple,则函数体内会被它们看成一个整体,当做tuple的一个元素。当调用函数是在list和tuple类型前面加一个*,会把他们的元素组合成一个tuple传入。

下面看调用它的例子:

def person( name , age , sex = '男' ,*hobby):
    # 打印用户信息
    print("name: ",name)
    print("age: ",age)
    print("sex: ", sex)
    print("hobby: ",hobby, type(hobby))

# 调用方式一:直接用逗号隔开
person('张三',30,"女","钢琴", "书法" )

# 调用方式二:list输入
person('张三',30,"女",["钢琴", "书法" ])

# 调用方式三:tuple输入
person('张三',30,"女",("钢琴", "书法" ))

# 调用方式四:*list输入
person('张三',30,"女",*["钢琴", "书法" ])

# 调用方式五:*tuple输入
person('张三',30,"女",*("钢琴", "书法" ))

输出:

name:  张三
age:  30
sex:  女
hobby:  ('钢琴', '书法') <class 'tuple'>
name:  张三
age:  30
sex:  女
hobby:  (['钢琴', '书法'],) <class 'tuple'>
name:  张三
age:  30
sex:  女
hobby:  (('钢琴', '书法'),) <class 'tuple'>
name:  张三
age:  30
sex:  女
hobby:  ('钢琴', '书法') <class 'tuple'>
name:  张三
age:  30
sex:  女
hobby:  ('钢琴', '书法') <class 'tuple'>

(2)字典类型的不定长参数

在参数前加**,表示该参数为字典类型的不定长参数

例如:

def person( name , age , sex = '男' ,**hobby):
    # 打印用户信息
    print("name: ",name)
    print("age: ",age)
    print("sex: ", sex)
    print("hobby: ",hobby, type(hobby))

# 调用 person 函数
person('张三',30,"女",hobby_1 = "钢琴",hobby_2 = "书法") 

输出:

name:  张三
age:  30
sex:  女
hobby:  {'hobby_1': '钢琴', 'hobby_2': '书法'} <class 'dict'>

3. 函数参数的传递

在 Python 中,字符串,整形,浮点型,tuple 是不可更改的对象,而 list , dict 和set是可以更改的对象。

  • 不可变对象:重新赋值后,地址将会改变,相当于新生成一个变量,比如:strings, tuples, 和 numbers
  • 可变对象:可以修改变量的值,而且地址不会发生改变。比如list,dict,set

在函数中传递可变类型和不可变类型。

  • 不可变类型相当于C++的值传递
  • 可变类型相当于C++的引用传递
  • 传递不可变对象举例
def change(a):
    print(id(a))  # 指向的是同一个对象,打印地址
    a = 10
    print(id(a))  # 一个新对象,地址修改

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

输出:

139942951610672
139942951610672
139942951610960
  • 传递可变对象举例
#!/usr/bin/python3

def changeme(mylist):
    "修改传入的列表"
    mylist.append([1, 2, 3, 4])
    print("函数内取值: ", mylist)
    return

mylist = [10, 20, 30]
changeme(mylist)
print("函数外取值: ", mylist)

输出:

函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
函数外取值:  [10, 20, 30, [1, 2, 3, 4]]

4. 函数的返回值

4.1 不带参数的返回值

不带参数值的 return 语句返回 None。例如:

def person():
    pass

print(person())

输出:

None

4.2 接收多个返回值

当有多个返回值时,多个返回值将以元组的形式传出来。例如:

def  division ( num1, num2 ):
         a = num1 % num2
         b = (num1-a) / num2
         return b , a

num1 , num2 = division(9,4) # 分开接收
tuple1 = division(9,4)

print (num1,num2,type(num1),type(num2))
print (tuple1,type(tuple1))

输出:

2.0 1 <class 'float'> <class 'int'>
(2.0, 1) <class 'tuple'>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值