Python函数基础知识
目录
**wargs 接受所有关键字参数*******************************************
函数的基础
- # 申明方法
def 方法名(形参):
代码块
- # 调用方法
方法名(实参)
[code]def demo(name,age): print(f'(我是{name},我今年{age}岁)) #调用方法 demo('admin',12)
形参:
位置形参:def demo(name,age)
默认值形参:def demo(name,age=12)
二者可以混合使用,但是 位置形参 必须在默认值形参之前
实参:
位置实参:demo('admin',12)
关键字实参: demo('admin',age=12)
二者可以混合使用,但是 位置实参 必须在关键字实参之前
动态传参:
*参数 是位置参数
**参数 是关键字参数 方法接受到的是字典
位置参数>动态位置参数>关键字参数>动态关键字参数
在形参上:*聚合 **聚合
在实参上:*打散 **打散
格式:
*args 接受所有位置参数
[code]lis = [1,2,3,4] def function(*args): # 聚合 将打散的 内容 再次组成元组形式 (1,2,3,4) print(args) print(*args) function(lis) # function(*lis) #打散 *lis实际上就是 1,2,3,4 #结果: ([1, 2, 3, 4],) [1, 2, 3, 4] (1, 2, 3, 4) 1 2 3 4
**wargs 接受所有关键字参数*******************************************
[code]dir = {'a':1,'b':2,"c":3,"d":4} def function(**kargs): #这里将其聚合成 {'a':1,'b':2,"c":3,"d":4} # print(**kargs) #报错 TypeError: 'a' is an invalid keyword argument for this function # print(*kargs) # a b c d print(kargs) #{'a': 1, 'b': 2, 'c': 3, 'd': 4} function(**dir) # 其实这里的是 a=1 b=2 c=3 d=4 # function(*dir) #报错 TypeError: function() takes 0 positional arguments but 4 were given # function(dir) #报错 TypeError: function() takes 0 positional arguments but 1 was given #注意 : dir = {'a':1,'b':2,"c":3,"d":4} def function(**kwargs): print(**kwargs) #报错 TypeError: 'a' is an invalid keyword argument for this function function(**dir) 为什么打印 **kwargs 会报错的原因是: 字典前加 ** 会将字典打散为 a=1,b=2,c=3,d=4。 传入 function(**kwargs)方法后会被 **kwargs 全部接受 聚合成 {'a': 1, 'b': 2, 'c': 3, 'd': 4} 而 print(**字典) 则会将 字典再次打散为关键字参数, 但是print 的方法的参数中是没有 **kwargs(接受所有的关键字参数的) , 因此会报错 但是 print()方法中是有 *args 参数的,也就是为什么print(*args) 并不会报错
不容易理解的地方:
[code]def func(**kwargs): print(kwargs) dic = {"1":1} func(**dic) #结果: {'1': 1} #减少写参数量 # dic = {"1":1} # func(**dic) 等同于 func("1"=1) 虽然后者报错,但是在实际空间中是以这种方式存储
return 返回值
[code]def demo(name,age): print(f'(我是{name},我今年{age}岁)) return print("这句话不会执行") #调用方法 demo('admin',12)
注意:在一个方法体内,return之后的代码都不会执行到
命名空间
内置命名空间(优先级最高)
存放Python解释器为我们提供的名字,其中就包括内置函数,list,dict,tuple,set,str,int等都属于内置空间的。
全局命名空间
局部命名空间:函数内部
取值顺序:就进原则
globals()函数来查看全局作用域中的内容
locals()来查看当前作用域的内容
global 变量名 : 表示使用全局变量
在局部变量中使用,当全局变量中没有该参数时,则会将局部变量升级为 全局变量 (不推荐)
nonlocal 变量名 : 找局部作用域中,离他最近的那层的变量给引用过来,。如果除全局外的局部都不存在改变量则会报错(No find)
函数名:
[code]def func(): pass
函数名可以当作值去赋值给变量
[code]a = func a() #调用的是func()
函数名可以当作参数传递给函数
[code]def func2(msg): print(msg) func2(func) #执行后的结果 打印的是 func方法的内存地址
函数名可以当作函数返回值,注意:返回值不能加括号
[code]def func(): def func_copy(): pass return func_copy print(func()) #打印的是 func_copy的内存地址 print(func()()) #打印的是 func_copy的方法内容
函数名可以当作元素存放一个容器里
[code]def func():pass def func2():pass def func3():pass li = [func,func2,func3] #列表中存的其实是 每个方法的内存地址 for i in li: i() #打印每一个方法
查看函数的内存地址 print(函数名)
[code]print(func)
闭包
如何分辨闭包:
闭包必须是嵌套函数,内部函数在使用外部变量(非全局变量)就是闭包。
可以使用方法名.__closure__ 查看该函数是否为闭包 只要返回值不是None,他就是闭包
[code]def func(): n = 1 def func2(): print(n) return func2 #注意这里的返回值 只是func2的方法名,也就是将其的地址返回。 func()()
闭包的作用:
1.可以读取到其他函数内部的变量
2.可以将变量保存在内存中,使其生命周期增强
3.可以保护其内部变量不受外界影响,不被修改,做到私有化
迭代器:
[code]lst = [1,2,3,4,5] l = lst.__iter__() # 从一个可迭代对象转换成迭代器 print(l.__next__()) #从迭代器中读取第一个
可迭代对象:具有 __iter__()方法
print(isinstance('列表等',Iterable)) 判断是否为可迭代对象
迭代器:拥有 __iter__()方法和__next__() 方法
print(isinstance('列表等',Iterator)) 判断是否为迭代器
[code]# for循环机制 li = [1,2,3,4,5,6] for i in li: print(i) # 等价于 li2 = li.__iter__() while True: # 循环: try: print(li2.__next__()) # 获得下一个值: except StopIteration: break # 遇到StopIteration就退出循环
递归:
其实就是方法自己本身再调用自己
[code]# 一个简单的递归 def fun(n): print(n) n += 1 fun(n) fun(1) #结果会报 # RecursionError: maximum recursion depth exceeded while calling a Python object
递归注意事项:有进也有出
递归的最大深度:官方定义是 1000,而实际上测试 只是 998
[code]# 递归求阶乘 def factorial(n): if n == 1 : return 1 else: return n*factorial(n-1)
递归的深度可以修改:
[code]import sys sys.setrecursionlimit(int num) #调用sys系统模块
- python-基础知识之函数一
- Python基础知识- 函数定义,参数问题(hard)
- Python基础知识3:函数、三元函数、lambda函数
- [Python图像处理] 一.图像处理基础知识及OpenCV入门函数
- 温故知新python3--基础知识3(函数高级特性)
- 【脚本语言系列】关于Python基础知识函数缓存,你需要知道的事
- Python基础知识(四)--函数
- Python基础知识(2)——函数
- Python基础知识详解(数据类型、函数、包)
- Python基础知识:函数、三元函数、lambda函数
- 关于python的基础知识2--函数
- Python 专题一 函数的基础知识
- python基础知识之常用函数
- python基础知识梳理之函数
- [Python学习] 专题一.函数的基础知识
- 个人随手自学笔记--python3入门及基础知识点(3)——包,模块,函数,类
- python-基础知识之函数二
- Python 第一章 基础知识(6) 函数
- [Python学习] 专题一.函数的基础知识