Python 注解+参数+返回值小结

2021-07-23 12:19:16 浏览数 (2)

这篇文章偏记录类型,不是写的很细。我先说一下什么是注解,就是参数类型的显化操作,而且会给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)

0 人点赞