前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python函数基础-参数-返回值-注释-01

python函数基础-参数-返回值-注释-01

作者头像
suwanbin
发布于 2019-09-26 03:32:00
发布于 2019-09-26 03:32:00
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

什么是函数

函数就是有特定功能的工具 # python中有内置函数(python解释器预先封装好的)与自定义函数(用户自定义封装的)之分

为什么要用函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 可以减少代码冗余,增加代码复用性
# 使代码逻辑更加清晰
# 一次编写,任意次数调用

函数定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
精简版定义:
def 函数名():
    代码体

调用:
函数名()
'''

函数名命名规范 # 函数名的命名规则与变量名的一模一样 ,千万注意两点 # 不能以关键字作为函数名,避免与内置函数重名(比如内置函数 len)(******) , # 函数也应该做到见名知意

函数的定义及执行顺序

注意点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
函数在定义阶段只检测语法,不执行代码
    比如里面写多了一个 if  后面就没了,运行就会报错
    执行的时候,代码有问题才会报错了

变量可以通过变量名找到对应的值
函数可以通过 函数名 加 括号 找到函数体所对应的的代码并执行

函数必须先定义后调用(函数名+括号)
定义了之后的函数可以在任意位置调用
'''

函数的一种特殊应用

空函数: 在项目的初期应用频率非常高,可以快速构建项目框架,使项目架构与进度清晰明了(还有几个功能(pass)没写)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 可以直接罗列出功能名,也可以给出一些参数
def register():
    pass


def login():
    pass


def print_shop_list():
    pass


def choice_shop():
    pass


def pay():
    pass

return关键字

# 函数要想返回给调用者一个值,就必须使用return 关键字

函数返回值 # 测试函数有无返回值可用变量接收,如果是None 就是没有返回值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 函数返回值的五种情况(出于演示,就不注重函数前后空行的标准了)
# 1.不写return
def func_no_return():
    print(1, 2, 3)
print(func_no_return())  # 接受到的是None
# 1 2 3
# None

# 2.只写return
def func_just_return():
    print(1, 2, 3)
    return
    print("hello world.")  # 这一句print 并未被执行
print(func_just_return())  # 接受到的是None
# 1 2 3
# None

# 3.return None
def func_return_none():
    print(1, 2, 3)
    return None
print(func_return_none())  # 接受到的是None
# 1 2 3
# None

# 4.return 返回一个值
def func_return_one():
    print(1, 2, 3)
    return 1
print(func_return_one())  # 接收到的是返回值 1, 这个值可以是python的任意数据类型
# 1 2 3
# 1

# 5.return多个值
def func_return_many():
    print(1, 2, 3)
    return 1, 2, 3
print(func_return_many())  # 接收到的是一个元组,包裹上这三个元素,想要多个返回值不被包装成元组返回,可以选择将其整体包装成一个大类型(例如列表,最外层在套一个列表 [[1,2,3]. [1,2,3]])
# 1 2 3
# (1, 2, 3)

利用return 关键字可直接结束函数 # 某些场景比break还要好用些

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# return除了可以返回值之外,还可以直接结束整个函数的运行,而无需像break一样,一层一层结束
def hi():
    while True:
        name = input("what your name? >>>:")
        if name:
            print('hi, name! nice to meet you!')
        else:
            continue
        while True:
            age = input("how old are you? >>>:")
            if age:
                print(f"oh, it hard to see that you are {age} years old!")
            else:
                continue
            while True:
                hobby = input("what's your hobby? >>>:")
                if hobby:
                    print(f'you like {hobby}, it seems so cool.')
                    return


hi()

小推理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'''
所有的函数都有返回值,无论你写不写return
    python中,不写返回值默认返回None,其实也算返回值
只写return或者return None 并不是为了考虑返回值的问题,而是为了结束函数的运行
'''

函数的参数

形参: # 在函数定义阶段,函数的括号内写的变量名,叫做该函数的形式参数,简称形参

实参: # 在函数调用阶段,括号内实际传入的值,叫做实际参数,简称实参

形参与实参的关系: # 形参就相当于变量名,而实参相当于变量的值,函数调用传参的过程就是给形参、变量名赋值的过程

注意点: # 实参和形参的绑定关系只在函数的运行阶段有效,函数运行结束后自动解除 # 只在函数内部有效,函数外部无任何影响

位置参数

位置形参: # 在函数定义阶段按照位置从左往右依次书写的变量名 叫做函数位置形参

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def my_max(x, y):
    print(x, y)
    if x > y:
        return x
    else:
        return y
# res = my_max(1)  # 会报错,在调用函数的时候 少一个实参不行
# res = my_max(1, 2, 3)  # 会报错,在调用函数的时候 多一个实参也不行
# 第一种直接按照位置传  一一对应
res = my_max(20, 10)
# 20 10
# 位置实参:在函数的调用阶段 传入的参数会按照位置一一对应给形参

# 第二种指名道姓的传  >>>:关键字传参
my_max(y=20, x=10)
my_max(10, y=20)  # 位置和关键字混合使用
my_max(20, y=40)
# 10 20
# 10 20
# 20 40

注意点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""
注意:在函数的调用阶段 位置参数和关键字参数可以混合使用
但是必须保证
    1.位置参数必须在关键字参数的前面(越短的越靠前,越长的越复杂的越靠后)
    2.同一个形参不能被多次赋值
"""

默认值参数

默认值参数: # 在函数的定义阶段,形参(变量名)就已经被赋值了的参数 , def my_max(x,y=100): # 这里的y 就是一个默认值参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def my_max(x, y=100):
    if x > y:
        return x
    return y
print(my_max(200))  # 这里没有传入默认参数y, y 等于 默认值函数定义时的 100,y = 100
print(my_max(200, 1000))  # 这里传入了默认参数y, y 等于 传入的 1000,y = 1000
print(my_max(y=200, x=1000))  # 这里使用关键字传参,传了 y = 200, y = 200
# 200
# 1000
# 1000

'''
# 在调用的时候可以不为默认值形参传值,默认使用定义阶段就已经绑定的值
# 在调用的时候如果可以给默认值形参传值 传了那么就使用你传的值
# 在定义阶段 默认值形参必须放在位置形参的后面
'''

默认值参数的应用场景(例如录入信息时的性别)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
student_infos = []
def record_student_info(student_name, student_age, student_gender='male'):
    student = dict(name=student_name, age=student_age, gender=student_gender)
    student_infos.append(student)

while True:
    student_name = input("请输入您的姓名>>>:").strip()
    student_age = input("请输入您的年龄>>>:").strip()
    student_gender = input("请输入您的性别>>>:").strip()
    if student_gender == 'female':
        record_student_info(student_name, student_age, student_gender)
    else:
        record_student_info(student_name, student_age)
    print(student_infos)

默认值传参面试可能会考到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 这里的问题是共用了同一个列表(画一张列表的变量关系引用图就知道了)
def info(username,hobby,l=[]):
    l.append(hobby)
    print('%s 的爱好是 %s'%(username,l))
info('jason','study')
info('tank','生蚝')
info('kevin','喝腰子汤')
info('egon','女教练')
# jason 的爱好是 ['study']
# tank 的爱好是 ['study', '生蚝']
# kevin 的爱好是 ['study', '生蚝', '喝腰子汤']
# egon 的爱好是 ['study', '生蚝', '喝腰子汤', '女教练']

# 解决方法1,每次传一个空列表过去
info('jason','study',[])
info('tank','生蚝',[])
info('kevin','喝腰子汤',[])
info('egon','女教练',[])
# jason 的爱好是 ['study']
# tank 的爱好是 ['生蚝']
# kevin 的爱好是 ['喝腰子汤']
# egon 的爱好是 ['女教练']

# 解决方法2,改写函数默认参数,没传就重新申请一个空列表
def info(username,hobby,l=None):
    if l == None:
        l = []
    l.append(hobby)
    print('%s 的爱好是 %s'%(username,l))

info('jason','study')
info('tank','生蚝')
info('kevin','喝腰子汤')
info('egon','女教练')
# jason 的爱好是 ['study']
# tank 的爱好是 ['生蚝']
# kevin 的爱好是 ['喝腰子汤']
# egon 的爱好是 ['女教练']

易错点**** # 函数在定义阶段 内部所使用的变量都已经初始化完毕了,不会因为调用的位置的变化 而影响到内部的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
m = 100
def my_max(x, y=m):
    print(x, y)
m = 222
my_max(111)
# 111 100

'''
函数在定义阶段 内部所使用的变量都已经初始化完毕了
不会因为调用的位置的变化 而影响到内部的值(暂时可忽略)

函数无论在什么地方被调用
都会跑到函数定义阶段去执行代码
形参中用到的值都是往函数定义阶段代码往上找
'''

可变长参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 站在调用函数传递实参的角度  实参的个数不固定的情况 也就意味形参也不固定
# 站在形参的角度 可以用***来接收多余的(溢出的)位置参数和关键字参数

站在形参(函数定义)的角度看 * 、**

  *args # 形参中的*会将多余的(溢出的)位置实参 统一用元组的形式处理 传递给* 后面的形参名,* 在形参中只能接受多余的位置实参,不能接受关键字实参

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x, y, *z):
    print(x, y, z)  # z = (3, 4, 5, 6, 7, 8, 54, 43, 4, 5, 6, 6, 7, 8)
func(1, 2, 3, 4, 5, 6, 7, 8, 54, 43, 4, 5, 6, 6, 7, 8,)
# 1 2 (3, 4, 5, 6, 7, 8, 54, 43, 4, 5, 6, 6, 7, 8)
# func(1, 2, 1, 3, 4, 5, z=15)  # 报错,TypeError: func() got an unexpected keyword argument 'z'

  **kwargs # ** 会接收所有多余的关键字参数 并将关键字参数 转换成字典的形式 字典的key就是关键字的名字,字典的value就是关键字的名字指向的值 将字典交给** 后面的变量名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x, y, **z):
    print(x,y,z)  # 去掉前面关键字传参成功的x, y,将剩下的关键字传参存入z 中, z = {'z': 1, 'a': 1, 'b': 2, 'c': 3}
func(x=1, y=2, z=1, a=1, b=2, c=3)
# 1 2 {'z': 1, 'a': 1, 'b': 2, 'c': 3}

站在实参(函数调用)的角度看 * 、**

  *args # 会将容器类型(列表、元组、集合,字典不能)打散成位置实参一一传入, * 内部可以看成for 循环

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x,y,z):
    print(x,y,z)
# l = [1,2,3]
# a,b,c = l
# func(a,b,c)
func(*[1,2,3])  # * 会将列表打散成位置实参一一传入等价于func(1,2,3)
func(*(1,2,3))  # 等价于func(1,2,3)
# 1 2 3
# 1 2 3

def func(x,*z):
    print(x,z)
func(1,*{1,2,3})  # * 在形参中只能接收多余的位置实参 不能接收关键字实参
# 1 (1, 2, 3)

  **kwargs # ** 会将字典拆封成key = value的形式,以关键字传参的方式传值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x, y, z):
    print(x, y, z)
func(x=1, y=2, z=3)
# 1 2 3
d = {'x': 1, 'y': 2, 'z': 333}
func(**d)  # 等价于func(x=1,y=2,z=333)
# 1 2 333

可接收任意参数的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 需求:你写的函数 无论调用者按照正确传参的方式无论怎么传 你的函数都能够正常执行
def func1(*x, **y):
    print(x, y)
func1(1, 2, 3, 4, 5, 6, x=1, y=2, z=3)
# (1, 2, 3, 4, 5, 6) {'x': 1, 'y': 2, 'z': 3}

"""
下面是python推荐形参***通用的写法(后面的参数名命名推荐)
"""
def func2(*args, **kwargs):  # 可接收任意参数的函数
    print(args, kwargs)
func2(1, 2, 3, 4, 5, 6, x=1, y=2, z=3)
# (1, 2, 3, 4, 5, 6) {'x': 1, 'y': 2, 'z': 3}

命名关键字参数

命名关键字参数: # 在函数定义阶段,写在 * 与 ** 之间的参数

  下面的z 和 m 都是命名关键字参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def func(x, y=1, *args, z=3, m, **kwargs):
    print(x, y)
    print(args)
    print(z, m)
    print(kwargs)


func(1, 2, 3, 4, [5, 6, 7], m=1, z=3, n=1, q=1, p=2)  # 关键字传参 m = 2
# 要想给m传值, 必须用关键字传值 m = 2,如果直接用位置参数,显然会被 *args接收(截取)
# 调用 func() 返回值如下:
# 1 2
# (3, 4, [5, 6, 7])
# 3 1
# {'n': 1, 'q': 1, 'p': 2}

注意: # 在给命名关键字参数传值的时候 只能用关键字为其传值 , # 在定义阶段 给你感觉好像是z是默认值参数 放在了m这个位置参数的前面了 应该报错,但其实 z 和 m 都不是默认值参数和位置参数, 他们是命名关键字参数

函数的注释

函数注释的好处: # 规范的代码注释可以让封装的方法被快速读懂,让调用者快速上手....(有着诸多好处)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 在pycharm 中只需要在函数定义def 关键字下一行 敲 ''' 回车即可自动出现函数注释格式,只需相应填充即可
"""
该函数的作用
:param x: 对形参x的解释
:param y: 对形参y的解释
:return: 对函数返回值的解释
"""

查看写好的函数注释: # help(函数名) ,会返回该函数的注释信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def say_hi(name):
    '''
    跟用户打招呼
    :param name: 用户名
    :return: 拼接好的打招呼语句
    '''
    hi = '{name} 你好,很高兴见到你!'.format(name=name)
    return hi


print(help(say_hi))
# Help on function say_hi in module __main__:
# 
# say_hi(name)
#     跟用户打招呼
#     :param name: 用户名
#     :return: 拼接好的打招呼语句
# 
# None

上面介绍了函数的return返回值、参数、注释, 下面给出一个标准的函数定义格式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""
def 函数名(形参1, ......):
    '''
    该函数的作用(函数的注释)
    :param 形参1: 对形参1的解释
    :param .....:
    :return: 
    '''
    代码体
    return 函数的返回值
"""
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
五年五次飙榜,浪潮如此自我挑战为哪般?
要我说,中国本土的存储厂商当下最强悍的主力军,应该是Inspur了。这不,浪潮这次又登顶SPC-1了。
冬瓜哥
2021/07/22
4730
深入浅出分布式存储性能优化方案
可靠性:是存储系统的基石,一款存储系统至少需要提供99.99%的数据可靠性,数据丢失或者错乱对于存储系统是致命的,对大数据、云存储这样大规模的分布式集群
焱融科技
2020/02/27
2.4K0
深入浅出分布式存储性能优化方案
站在存储“珠穆朗玛“峰顶,会带给宏杉哪些蜕变?
珠穆朗玛峰是每个攀登者心中的圣地,站在地球之巅也是每个攀登者的梦想。存储领域也有一个“珠穆朗玛”,就是SPC-1测试,创造SPC-1测试的世界纪录,这是存储厂商共同的梦想。
用户5498443
2020/11/19
4260
站在存储“珠穆朗玛“峰顶,会带给宏杉哪些蜕变?
企业级SSD,性能之后,还有什么?
现在的企业级NVMe SSD的性能真是让人震撼,有些SSD的性能动辄上百万IOPS,延迟20μs~1ms(视队列深度),冬瓜哥这辈子恐怕都用不了这么高的性能。冬瓜哥感觉,这个性能应对99%的应用已经完全够用了。剩下的1%就是一些极其特殊的场景,比如广泛存在于大型互联网后端的一些系统,以及少数特殊行业。
冬瓜哥
2019/06/10
1.9K0
企业级SSD,性能之后,还有什么?
浪潮存储:业绩数据只是一方面,背后的硬实力才是跨象限晋级的秘密武器
12月初,国际调研机构Gartner对外发布2020年全球主存储魔力象限报告,共有13家全球存储厂商入选,5家出局。
数据猿
2021/01/05
4890
性能极致:全闪存储介绍
这一时代,数据存储具有三大需求,分别是 EB 级容量、亿级 IOPS(每秒进行读写操作的次数,Input/Output Operations Per Second)和智能管理,亿级 IOPS 需求使得存储介质的变革势在必行。,全闪存储普遍被认为是存储行业的发展方向,其具备远高于传统磁盘存储的数据吞吐能力及更低的时延。
存储小白
2021/12/09
2.5K0
新华三近期重磅发布的三员存储悍将有何看点
7月8日,紫光股份旗下新华三集团以“智以致用·速达未来”为主题,在京召开“2021新华三存储新品发布会”,重磅推出云智原生的新一代端到端NVMe闪存存储H3C/HPE Alletra、分布式融合存储H3C UniStor X10000,以及全新升级的智慧中枢数据平台。
冬瓜哥
2021/07/22
8480
如何基于Ceph设计与构建一套软件定义存储系统
目前流行的软件定义存储相关的开源项目主要有GlusterFS、Swift、Lustre和Ceph。这四个项目各有各的特点:GlusterFS提供文件存储,Swift提供对象存储,Lustre主要用在高性能计算,Ceph则基于一套系统提供块、对象及文件功能。
段立功
2022/06/13
6670
Gartner 2019分布式文件存储关键能力报告解读
近日,Gartner发布了2019年全球分布式文件存储关键能力报告(Critical Capabilities for Distributed File Systems),Dell EMC、IBM、浪潮、华为、Qumulo、Pure Storage、Red Hat共7家全球主流厂商入围测评。
冬瓜哥
2019/11/26
1.3K0
Gartner 2019分布式文件存储关键能力报告解读
虚拟化将是高端存储发展的重要趋势
现在,就站在个人的角度,综合目前EMC、IBM、HP、HDS、富士通和华为的高端存储产品特点,来谈谈这个老生长谈的问题。 松耦合 高端存储刚出现的时候,大家参考大型机的设计思路,采用的是紧耦合的多控体系架构,典型的代表是EMCDMX和HDSUSP。紧耦合架构的特点就是所有的资源都是物理集中在一起的,这些资源通常包括前端接口,后端接口和Cache,一般都插在一个大机箱里。紧耦合比较大的问题是扩展不方便,设计好几个插槽就只能用这几个插槽;另外,紧耦合架构在机房摆放不够灵活,一般只能集中摆放;还有一点成本较高,因
静一
2018/03/19
1.1K0
探索 Milvus 数据存储系统:如何评估和优化 Milvus 存储性能
本文将深入探讨 Milvus 架构,分析其核心存储组件,并介绍如何有效评估 Milvus 存储系统性能。
Zilliz RDS
2024/07/31
5950
探索 Milvus 数据存储系统:如何评估和优化 Milvus 存储性能
磕技术、筑平台,浪潮存储如何持续破局?
在看似稳定的市场格局中,浪潮存储近年来却强势崛起,用亮眼的成绩证明了破局依然可行。今年上半年,浪潮存储更是交出一份靓丽的成绩单:其高端全闪存、分布式存储就在SPC-1测试中接连夺魁,上半年整体出货量位居全球前五,分布式存储更是杀进第二存储市场全球前三,中国存储市场份额第二……
大数据在线
2021/11/10
2690
评测云硬盘读写性能
通过讲解如何优雅扩容云硬盘,我们了解了云盘连接到服务器上的具体操作过程。那么,如何进一步了解已挂载硬盘的实际性能呢?你或许会疑惑,测试硬盘性能,为什么不能用Linux系统自带的dd工具呢?而且不少人之前都这么用的:
溪歪歪
2020/12/13
8.2K7
评测云硬盘读写性能
全球存储市场趋缓,华为存储缘何逆势增长?
“49.6%的同比增长,全球市场排名第四,7%的市场份额,4.635亿美元的营收规模。”--这是华为存储2019年第三季度交出的成绩单。
大数据在线
2019/12/20
9810
全球存储市场趋缓,华为存储缘何逆势增长?
浪潮存储:以全栈能力驱动存储平台战略
用一个极致容量、极致性能、极简架构和极易管理的存储平台去支撑起一个新数据中心,这是浪潮存储的目标,也即今年3月浪潮存储宣布的存储平台化战略。
大数据在线
2019/07/08
9660
浪潮存储:以全栈能力驱动存储平台战略
华为FusionStorage 8.0:哪有什么一夜成名?其实全是百炼成钢
从去年11月份到今年春节前后,华为存储研发骨干曹长斌几乎每天都夜不能寐,因为他参与的FusionStorage 8.0 研发项目遇到各种棘手难题。那段时间,曹长斌甚至连吃饭、跑步都会想着如何解决研发面临的问题。
大数据在线
2019/07/08
8130
华为FusionStorage 8.0:哪有什么一夜成名?其实全是百炼成钢
从传统运维到云运维演进历程之软件定义存储(四)
前面系列已经讲完了硬件选型、部署、调优,在上线之前呢需要进行性能存储测试,本章主要讲述下测试Ceph的几种常用工具,以及测试方法。
DevinGeng
2019/04/09
1.7K0
从传统运维到云运维演进历程之软件定义存储(四)
若不是它,云存储根本起不来
近几年,新兴存储架构逐渐布满了市场,给由传统SAN架构占据的市场带来了大量的烟火气。不妨列举一下名词:分布式存储,ServerSAN,云存储,对象存储,超融合,一体机。实际上,这堆名词里,除了对象存储描述的是前端访问协议之外,其它的基本上都是基于分布式存储构建的。
冬瓜哥
2021/03/04
7590
YH10:分布式存储解决方案zData
云和大数据时代的到来导致各行各业数据量的爆发,面对业务数据的日益剧增,企业的IT系统在性能、稳定性和扩展性等方面都面临前所未有的巨大挑战。如何有效应对云和大数据的浪潮去拥抱变化,成为企业迫切面临的问题。 数据驱动的时代,一切竞争的核心都会归结于IT系统的竞争,然而传统数据库系统架构面临以下困境: 1、中心化的存储系统成为I/O存取的瓶颈,扩展成本高昂 2、小型机+高端存储,成本高昂,相对比较封闭,扩展能力差。 3、复杂的系统带来部署及操作、运维和管理的复杂性 分布式存储解决方案zData 为更好地保障企业
数据和云
2018/03/07
1.7K0
YH10:分布式存储解决方案zData
伪存储专家装X指南进阶版
之前我曾针对存储新人写过一篇《伪存储专家装X指南》文章,但更多的讲的装X是方式方法,关于存储技术方面的内容很少。
了不起的云计算
2021/03/29
4730
推荐阅读
相关推荐
五年五次飙榜,浪潮如此自我挑战为哪般?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档