[PY3]——Python的函数
Python函数总结图
1.调用
1.1 如何调用
1.1.1 函数名(传参)
# 函数使用函数名来调用,函数名后紧跟一对小括号,小括号里传入函数定义时要求的参数
add(9,9)
#9+9=18
1.2 传参
1.2.1 传参方法1:位置参数
1.2.2 传参方法2:关键字参数
def add(x,y):
ret=x+y
print('{}+{}={}'.format(x,y,ret))
return ret # 传参方法1:位置参数 指参数按照定义的顺序传入
add(8,9)
#8+9=17 # 传参方法2:关键字参数 指参数按照定义时的变量名传入
add(x=9,y=8)
#9+8=17 # 规则1:位置参数和关键字参数可以混合使用
add(3,y=9)
#3+9=12 # 规则2:但混合使用时,位置参数必须在前面,否则SyntaxError
add(x=3,9)
#SyntaxError: positional argument follows keyword argument # 注意1:
add('','')
#3+9=39 # 注意2:传入参数必须和函数定义时的参数相匹配,如果不匹配会抛出TypeError
add(9,9,9)
#TypeError: add() takes 2 positional arguments but 3 were given
1.3 参数解构
1.3.1 位置参数解构:*可迭代对象
1.3.2 关键字参数解构:*字典
iter=[3,9]
add(iter[0],iter[1])
#3+9=12 # 位置参数解构:*可迭代对象 可以把可迭代对象解构成位置参数
add(*iter)
#3+9=12
add(*range(2))
#0+1=1 # 关键字参数解构:*字典 可以把字典解构成关键字参数
# 关键字参数解构,key必须是str
dict={'x':3,'y':9}
add(**dict)
#3+9=12
2. 函数定义
2.1 如何定义
def 函数名(参数列表):
执行语句
return 返回值
def add(x, y): # 函数定义 def 表示定义一个函数;紧接着是函数名,函数名后面用一对小括号列出参数列表;参数列表后面使用一个冒号开始函数体
print(x + y) # 函数体是正常的Python语句,可以包含任意结构
return x + y # return语句表示函数的返回值
2.2 函数的参数
2.2.1 普通参数
2.2.2 默认参数
2.2.3 可变参数(*变量 **变量)
2.2.4 keyword-only参数
2.2.5 参数设置规则
# 可以为参数设置默认值,调用时如果不传递此参数,会使用默认值
def inc(x,y=9):
print(x+y) inc(1,10)
#11 inc(1)
#10
# 位置可变参数:*变量 构成元祖,以位置参数的形式传参
def sum(*lst):
print(type(lst))
ret=0
for x in lst:
ret+=x
print(ret) sum(1,2,3,4,5)
#<class 'tuple'>
#15
sum(1,2,3)
#<class 'tuple'>
#6 # 关键字可变参数:**变量 构成字典,以关键字参数的形式传参
def connect(**kwargs):
print(type(kwargs))
for k,v in kwargs.items():
print('{}——>{}'.format(k,v)) connect(host='127.0.0.1',port=3306)
#<class 'dict'>
#host——>127.0.0.1
#port——>3306 # 所以如果要创建一个接受任意类型参数的函数,可以如何定义?
def wrap(*args,**kwargs)
# 规则1:普通参数和可变参数可以一起使用,但传参必须匹配
def fn(x,y,*args,**kwargs):
print("x=",x)
print("y=",y)
print("args=",args)
print("kwargs=",kwargs) fn(1,2)
#x= 1
#y= 2
#args= ()
#kwargs= {} fn(1,2,0,2,6,a=3,b=9)
#x= 1
#y= 2
#args= (0, 2, 6)
#kwargs= {'b': 9, 'a': 3} fn(2,y=3)
#x= 2
#y= 3
#args= ()
#kwargs= {} fn(2,3,6,9,x=1)
#TypeError: fn() got multiple values for argument 'x' # 规则2:位置可变参数如果放普通参数之前,普通参数会变成keyword-only参数
def fn(*args,x):
pass
fn(2,3,0)
#TypeError: fn() missing 1 required keyword-only argument: 'x' # 规则3:而关键字可变参数就不能在普通参数|默认参数之前
def fn(**kwargs,x):
pass
#SyntaxError: invalid syntax def fn(**kwargs,x=9):
pass
#SyntaxError: invalid syntax
# 规则4:不建议可变参数和默认参数一起使用
def fn(*args,x=5):
print(args)
print(x)
fn(1,2,3)
#(1, 2, 3)
#5 def fn(x=5,*args):
print(x)
print(args)
fn(1,2,2)
#1
#(2, 2) # 规则5:位置可变参数和关键字可变参数可以同时使用,但位置可变参数必须在前面
def fn(*args,**kwargs):
print(args)
print(kwargs)
fn(1,2,3,a=3,b=9)
#(1, 2, 3)
#{'a': 3, 'b': 9} def fn(**kwargs,*args,):
pass
#SyntaxError: invalid syntax
3. 函数返回值
# 返回值除了返回值的作用外,还会结束函数,return后的语句将不会被执行
# 所以有结束函数作用的需求时,可以直接写“return”即可
def add(x,y):
return x+y
print("test") print(add(3,9))
#12
# 一个函数可以有多个return,执行到哪个就由哪个返回并结束
def guess(x):
if x>3:
return '>3'
print('end')
return '<=3'
print('end')
print(guess(3))
#<=3
print(guess(9))
#>3
# return可以提前结束循环
# 没有return返回None
def fn(x):
for i in range(x):
if i>=3:
return i
else:
print('not bigger than 3')
print(fn(10))
#3
#not bigger than 3 print(fn(2))
#None # return多个值时,可以用封装把返回值封装成一个元组、用解构来获取
def fn():
return 3,5
print(type(fn()))
#<class 'tuple'> x,y=fn()
print(x,y)
#3 5
4.函数作用域
4.1 上下级作用域的变量的关系
# 函数内部是一个局部作用域,对上级作用域(全局作用域)的变量x ——>只读可见,不可操作
x=1
def inc():
x+=1
inc()
#UnboundLocalError: local variable 'x' referenced before assignment def inc():
print(x)
inc()
#1
def fn():
xx=1
print(xx)
def inner():
print(xx) #上级作用域的变量对下级作用域是可见的
inner()
fn()
#1
#1 def fn():
xx=1
print(xx)
def inner():
xx=2 #在inner()作用域内定义的变量,那就只对该内部作用域及其下级作用域可见
print(xx)
inner()
print(xx)
fn()
#1
#2
#1
4.2 global 标记全局变量
#global 全局变量
xx=2
def fn():
global xx #将上级作用域的xx变量标记为全局变量
xx+=1 #则可对它操作了
fn()
print(xx)
#3 def fn():
global aa=1 #注意global只能标记,并不能定义变量
aa+=1
fn()
#SyntaxError: invalid syntax #除非你清楚的知道global会带来什么,并且明确的知道,非global不行, 否则不要使用global
4.3 nonlocal
def fn():
xx=1
print(xx)
def inner():
xx+=1 #对上级作用域定义的xx,原本是不可操作或定义的
print(xx)
inner()
fn()
#UnboundLocalError: local variable 'xx' referenced before assignment def fn():
xx=1
print(xx)
def inner():
nonlocal xx #nonlocal可以标记上一级作用域变量,使它可读可写
xx+=1
print(xx)
inner()
fn()
#1
#2
5. 匿名函数(lambda)
5.1 lambda 可以怎样被定义和使用
lambda x:x+1
#<function __main__.<lambda>> print((lambda x:x+1)(5))
# f=lambda x:x+1
print(f(5))
# # 匿名函数(lambda表达式) 只能写在一行上所以也有人叫它单行函数
f=lambda x: if x <0:
0
else:
0
#SyntaxError: invalid syntax
5.2 lambda支持所有的参数列表及规则
# 匿名函数支持所有普通函数所支持的参数列表及规则
print((lambda :0)())
# print((lambda x,y:x+y)(3,5))
# print((lambda *args:args)(*range(3)))
#(0, 1, 2) print((lambda *args,**kwargs:print(args,kwargs))(*range(3),**{str(x):x for x in range(3)}))
#(0, 1, 2) {'0': 0, '2': 2, '1': 1}
5.3 lamdba常和sorted( )等高阶函数一起使用
# 匿名函数通常用于高阶函数的参数,当此函数非常短小的时候,就适合使用匿名函数
6. 生成器函数(yield)
def gen():
print('a')
yield 1
print('b')
yield 2
return 3 g=gen() print(g)
#<generator object gen at 0x7f144845a308> print(next(g))
#a
#1 print(next(g))
#b
#2 print(next(g))
#StopIteration: 3 # 带yield语句的函数称之为生成器函数, 生成器函数的返回值是生成器
* 生成器函数执行的时候,不会执行函数体
* 当next生成器的时候, 当前代码执行到之后的第一个yield,会弹出值,并且暂停函数
* 当再次next生成器的时候,从上次暂停处开始往下执行
* 当没有多余的yield的时候,会抛出StopIteration异常,异常的value是函数的返回值
更多关于生成器参考:《[PY3]——函数——生成器(yield关键字)》
7. 函数执行流程
[PY3]——Python的函数的更多相关文章
- Python之函数作业
Python之函数作业 爬页面 #爬虫页面,send一次爬一次 from urllib.request import urlopen def get(): while True: url = yiel ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- python的函数
函数一词起源于数学,但是在编程中的函数和数学中的有很大不同.编程中的函数式组织好的,可重复使用的,用于实现单一功能或相关联功能的代码块. 我们在学习过程中已经使用过一些python内建的函数,如pri ...
- python strip()函数 介绍
python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除 ...
- python split()函数
Python split()函数 函数原型: split([char][, num])默认用空格分割,参数char为分割字符,num为分割次数,即分割成(num+1)个字符串 1.按某一个字符分割. ...
- Python数学函数
1.Python数学函数 1.abs(x):取绝对值,内建函数 2.math.ceil(x):向上取整,在math模块中 3.cmp(x,y):如果 x < y ,返回-1:如果 x == y ...
- Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- Python之函数与变量
本节内容 函数介绍及其作用 函数的定义与调用 函数的参数说明 全局变量与局部变量 值传递和引用传递 一.函数的介绍及其作用 编程语言中的函数与数学中的函数是有区别的:数学中的函数有参数(输入),就会有 ...
- Python基础-函数篇
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 函数与函数式编程 1.面向对象: 华山派-- ...
随机推荐
- TSQL--标示列、GUID 、序列
--1. IDENTIY 列不能为空,不能设默认值,创建后不能使用ALTER TABLE TableName ALTER COLUMN修改,每张表只能有一个自增列--2. 查看当前值:SELECT I ...
- java环境和Tomcat环境
这些变量名是一样的,变量的值需要自己根据自己的安装位置来确定 JAVA_HOME C:\Program Files\Java\jdk1.8.0_151 CATALINA_HOME(这个可能不需要) D ...
- Vsual Studio 高版本打开低版本项目的方法
https://www.cnblogs.com/jmliao/p/5594179.html
- [C#学习笔记]C#中的decimal类型——《CLR via C#》
System.Decimal是非常特殊的类型.在CLR中,Decimal类型不是基元类型.这就意味着CLR没有知道如何处理Decimal的IL指令. 在文档中查看Decimal类型,可以看到它提供了一 ...
- django drf CreateModelMixin和Serializer.validate_columun
view demo class ValidateCodeSet(mixins.CreateModelMixin, viewsets.GenericViewSet): serializer_class ...
- cesium编程中级(二)源码编译
cesium编程中级(二)源码编译 有些情况下,比如我们自己从Github下载了最新的代码,或者自己临时修改了一点代码,想要编译后的Build文件夹的内容,需要自行编译源码,这里介绍一下编译的方法 下 ...
- Asp.net Core过滤器
Asp.net Core五类过滤器:Authorization Filter.Resource Filter.Acton Filter.Exception Filter.Result Filter.优 ...
- GO学习笔记 - 变量在定义时没有明确的初始化时会赋值为“零值 ”。
官方教程:https://tour.go-zh.org/basics/12 变量在定义时没有明确的初始化时会赋值为 零值 . 零值是: 数值类型为 0 , 布尔类型为 false , 字符串为 &qu ...
- 使用Anaconda的python安装虚拟环境是出现错误:python -m venv venvdir----Error: Command '['D:\\Development\\Django\\test\\Scripts\\python.exe', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit
在创建python虚拟环境的时候,如果使用的是Anaconda中集成的python -m venv venvdir就会出现不能安装pip的错误,原因是Anaconda没有ensurepip, 解决办法 ...
- extjs Tree中避免连续单击会连续请求服务器
应用场景:在项目中我要做一个左边是tree,右边是panel的界面.当我单击tree中的一条记录时,发送请求,并将结果显示在右边的panel中.做完之后发现,如果连续单击就会连续请求两次服务器,毕竟用 ...