python基础python中的函数
Posted 非晚非晚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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'>
以上是关于python基础python中的函数的主要内容,如果未能解决你的问题,请参考以下文章