这篇文章偏记录类型,不是写的很细。我先说一下什么是注解,就是参数类型的显化操作,而且会给Python赋予一些静态语言的特性。
代码语言:javascript复制User = str
Age = int
Answer = str
# 其实这个习惯好,写一个明白的注解
def say_hello(u:User)->Answer:
return f"Hello {u}"
print(say_hello("Ha"))
首先,我们可以提前吧这个注解的名字改掉,这样更加人性化
代码语言:javascript复制a:str ="aa"
b:int = 1
def example(a:str) -> str:
return f"Hello {a}"
print(example("World"))
也可以提前吧参数写在外面,提前注解一下
代码语言:javascript复制# Callable
from typing import Callable,NoReturn
def show(msg:str)->NoReturn:
print(msg)
def get_msg(msg:str,func:Callable[[str],NoReturn])->NoReturn:
# 需要将参数类型和返回值的类型都注解出来
func(msg)
也可以给回调的函数去赋予注解
代码语言:javascript复制from typing import Any
def add(a):
return a-1
def add(a:Any)->Any:
return a-1
Any是一种,始祖类型?就反正好像是道生一,一生三,三生万物
里面的一
代码语言:javascript复制from typing import NoReturn
def show()->NoReturn:
print("Test NoReturn")
当我们的返回值啥也没有的时候,写这个
代码语言:javascript复制from typing import Sequence
# 更加泛化,不区分是list或tupe
msga:Sequence[str]=["我","爱","你"]
更加泛化的list类型
代码语言:javascript复制from typing import Dict,Mapping
d:dict[str,int]={}
# 注解返回类型
m:Mapping[str,int]={}
# 注解参数
字典
代码语言:javascript复制from typing import Tuple
info:Tuple[str,int,float]=("张",13,12.0)
元组,这几个说道很多,用到我再说
代码语言:javascript复制var:List[List[int]]=[[1,2],[2,3]]
print(var)
可以给List进行嵌套
代码语言:javascript复制name:List[str]=[1,'物品','说呢哦']
print(name)
代码语言:javascript复制from typing import List
l:List[int]=[1,2,3]
# 全部由整数构成的列表
也可以调用typing的强大能力,提前写好参数列表
代码语言:javascript复制a:int=123
b:str='hello'
# 变量类型的注解
代码语言:javascript复制def add(x:int,y:int)->int:
return x y
add(1,2)
->是返回值的注解类型
代码语言:javascript复制print(add.__annotations__)
# 这个属性里面有我编写的注解
也可以看到我们的注解
代码语言:javascript复制{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
结果是这样的
代码语言:javascript复制# 如果函数的形参中既有默认形参又有可变形参,则默认形参位于可变形参后面
def data(*args, sep="/"):
return sep.join(args)
print(data("2018","07","25"))
# 给你args可变形参传递了三个实参
data("2018","07","25",seq="/")
# 函数定义中的可变形参最多只能有一个,不能有两个可变形参,否则就会不知道是哪个实参传给了哪个形参
看我注释写的啥
代码语言:javascript复制# 字典形参,字典形参前面是两个**,这个形参指向一个dict对象,调用函数的时候必须以"key=value"的形式传递可变数量的形参,这些实参被组装成一个dict对象,并赋值给字典形参
# 字典形参必须位于可变形参的后面
def f(x,*y,**z):
print("X: ",x)
# 访问任意形参中的参数
for e in y:
print(e)
print()
# 访问字典形参中的参数
for key in z:
print(key,":",z[key])
f("hello","li ping",60.5,year="2018",month=7,day=25)
字典的解包
代码语言:javascript复制# 解封参数列表
def add(x,y):
return x y
print(add(3,5))
代码语言:javascript复制8
代码语言:javascript复制# 还是上面的函数,能不能直接将求和的两个数放在一个tuple或者list里面,然后传给add呢
ab=[3,5]
print(add(ab))
代码语言:javascript复制# 上面是错误的
print(add(ab[0],ab[1]))
代码语言:javascript复制# 更简单的怎么写,解封实参列表
print(add(*ab))
代码语言:javascript复制# 如果参数在一个字典里面,用**分离
def f(name,score=0.0):
print('the name: ',name)
print('the score: ',score)
d = {
"name":"li ping",
"score":"60.5"
}
f(**d)
代码语言:javascript复制def showconfig(**kwargs):
# 实参名和值组成一个字典
for k,v in kwargs.items():
print('{} = {}'.format(k,v))
showconfig(host='127.0.0.1',port='80',username='zzg',password='1234')
代码语言:javascript复制def fn(*args,x):
# keyword-only参数
print(x)
print(args)
代码语言:javascript复制fn(3,4,x=7)
代码语言:javascript复制def fn(x,y,z=3,*arg,m=4,n,**kwargs):
print(x,y,z,m,n)
print(args)
print(kwargs)
各种参数的顺序
代码语言:javascript复制def guess(x):
if x>3:
return ">3"
else:
return"<=3"
guess(3)
# 一次只能执行一个return语句
代码语言:javascript复制def fn(x):
for i in range(x):
if i>3:
return 1
# 条件结构来控制return语句
else:
print("{} is not greater than 3".format(x))
后面是两个返回值的知识,一个函数的只能有一个return结果,而且可以使用分支语句来控制,还有就是如果没有return语句,其实还是会返回一个return(None)