函数混淆知识点及实例详解
参数传递
a=[1,2,3]
a="Runoob"
在Python中,类型属于对象,变量没有类型,上边代码[1,2,3]是list类型,“Runoob”是字符串类型,但是变量a没有类型,他仅仅是一个对象的引用(一个指针),可以指向list对象或是其他对象。
可变与不可变对象
数字、字符串和元组是不可变对象,列表,字典等可变。
- 不可变类型:变量赋值a=5后再赋值a=10,这里是新生成一个int值对象10,再让a指向他,而5被丢弃,相当于新生成了a;
- 可变类型:变量赋值la=[1,2,3]后再赋值la[2]=5,则是将list la的第三个元素值改变,本身la没有动,只是其一部分值被改变了。
def ChangeInt(a):
a=10
b=2
ChangeInt(b)
print(b)
#输出为2
#实例中有 int 对象 2,指向它的变量是 b,在传递给 ChangeInt 函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 Int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它。
默认参数
调用函数时,默认参数的值如果没有传入,则被认为是默认值。下例会打印默认的age,如果age没有被传入:
def printinfo(name, age = 35 ):
"打印任何传入的字符串"
print("Name: ", name)
小项目
- 输出一串文本 N次 。 这里的文本是必须参数,次数是可选参数,且次数有默认值
def zifu(str,count=5):
print(str*count)
zifu('bhfg',count=3)
- 输出斐波拉楔数列的前20项
def feibo(num):
if num<=1:
return 1
else:
return feibo(num-1)+feibo(num-2) #使用迭代
for i in range(21):
print(feibo(i),end=' ')
不定长参数
def functionname([formal_args,] *var_args_tuple ):#加了*星号的变量名会存放所有未命名的变量参数
"函数_文档字符串"
function_suite
return [expression]
# 可写函数说明
def printinfo( arg1, *vartuple ):
"打印任何传入的参数"
print("输出: ")
print(arg1)
for var in vartuple:
print(var)
return;
# 调用printinfo 函数
printinfo( 10 );
printinfo( 70, 60, 50 );
#输出:
10
#输出:
70
60
50
内嵌函数和闭包
python中的函数定义是可以嵌套的,就是可以在函数内部再建一个函数。内部的函数就为:内嵌函数
闭包:内部函数使用外部函数的局部变量,那么我们就称内部函数为闭包
def fun():
out_string = '大鱼'
def text_combine(string2): #因为out_string为外部函数的局部变量,所以这个内部函数就是闭包
print(out_string+string2) #连接两个string并输出
text_combine('AI')
fun()
#输出
大鱼AI
匿名函数lambda
lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
lambda argument_list参数列表 : expression
filter函数
filter(function, iterable可迭代对象)
num_list=[0,1,2,3,4,5,6,7,8,9]
print(list(filter(lambda x: x % 3 == 0,num_list))) #筛选出能被3整除的数
[0, 3, 6, 9]
map函数
map(function函数, iterable, ...一个或多个序列)
num_list=[0,1,2,3,4,5,6,7,8,9]
a=list(map(lambda x: x+4,num_list)) #将列表中的所有函数加一
print(a)
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
值得注意的是,这里的filter()、map()函数返回的都是迭代器(引用的意思), 不能直接读取 ,需要使用list进行转换。
函数小项目
尝试filter() 、map() 结合lambda的用法,例如找出1-100内的所有的偶数、奇数,并将其逐一对应相乘。
l=[]
for i in range(1,101):
l.append(i)
a=list(filter(lambda x:x%2==0,l)) #这里一定要加list,否则返回的就是地址
b=list(filter(lambda x:x%2!=0,l))
c=list(map(lambda x,y:x*y,a,b)) #map实现一一对应关系
print(c)
三目表达式
条件为真时的结果 if 判段的条件 else 条件为假时的结果 :print(x if(x>y) else y)
请对方输入一个0-9之间的数字(整数),进行检查,若不是数字提示:您输入的不是数字,请输入0-9间的数字,若数字不在0-9范围内,提示用户输入0-9之间的数字,直至用户输入正确。
num=int(input('请输入一个0-9之间的数字:'))
print('输入正确。'if num>=0 and num<=9 else "请输入一个0-9")
random函数
import random
print( random.randint(1,10) ) # 产生 1 到 10 的一个整数型随机数
print( random.random() ) # 产生 0 到 1 之间的随机浮点数
print( random.uniform(1.1,5.4) ) # 产生 1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print( random.choice('tomorrow') ) # 从序列中随机选取一个元素
print( random.randrange(1,100,2) ) # 生成从1到100的间隔为2的随机整数
a=[1,3,5,6,7] # 将序列a中的元素顺序打乱
random.shuffle(a)
print(a)