【Python】3.函数混淆知识点及实例详解

函数混淆知识点及实例详解

参数传递

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)

小项目

  1. 输出一串文本 N次 。 这里的文本是必须参数,次数是可选参数,且次数有默认值
def zifu(str,count=5):
    print(str*count)
    
zifu('bhfg',count=3)
  1. 输出斐波拉楔数列的前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)

猜你喜欢

转载自blog.csdn.net/susanhc/article/details/89520482