Python 序列类型以及函数参数类型

当然在学习Python的道路上肯定会困难,没有好的学习资料,怎么去学习呢? 学习Python中有不明白推荐加入交流群号:984137898 群里有志同道合的小伙伴,互帮互助, 群里有不错的视频学习教程和PDF!
我们先来看个例子

>>> x, y, z = [1,2,3]>>> x1>>> y2>>> z3复制代码

上面的操作叫做「多重赋值」,其实,只要是「序列类型」的,都可以有这种操作。

序列类型包括这几种:列表(list)、元组(tuple)、range、str、binary sequence type

>>> [1,2,3]# 列表>>> (1,3,3)# 元祖>>> range(1,4)# range>>>'text string: 文本字符串'# str>>> b'abc'# byte (binary sequence type 的一种,这里了解就行)复制代码

所以,我们看到下面的用法就不奇怪了

>>> x, y ='你好'>>> x'你'>>> y'好'复制代码

这个也好理解

>>>'abc'>'aac'# 字典序比较True>>> ['a','b','c'] > ['a','a','c']# 同上True复制代码

当然,「序列类型」还有很多类似的操作

>>>1in [1,2,3]# x in sTrue>>>'a'in'abc'True>>> [1] *5# s * n[1,1,1,1,1]>>>'a'*3'aaa'>>> len([1,2,3])# len(s)3>>> len('abc')3>>># 等等...复制代码

函数参数类型

共有三种:位置参数(Positional Arguments)、可变参数(Arbitrary Arguments)、关键字参数(Keyword Arguments)。

先有个整体的认识。函数定义如下

defintroduce(name, *hobbies, **extra_info):print('Name:')    print(name)    print('Hobbies:')forhobbyinhobbies:        print(hobby)    print('Extra info:')forkeyinextra_info:        print(key,':', extra_info[key])复制代码

调用

introduce('xiaoming','movie','game',          age=22, address='cn')复制代码

输出如下

Name:xiaomingHobbies:moviegameExtrainfo:age :22address : cn复制代码

其中,name 为「位置参数」, *hobbies 为「可变参数」, **extra_info 为「关键字参数」。

「位置参数」是指函数调用时根据参数位置进行赋值

>>> # arg1 , arg2 为「位置参数」...>>> deff(arg1, arg2):... print(arg1, arg2)...>>> # 实参 1 对应形参 arg1 ,所以 arg1 = 1 。arg2 类似...>>> f(1,2)12>>> f(1)# 少参数会报错Traceback (most recent call last):  File"<stdin>", line1,inTypeError: f() missing1required positional argument:'arg2'>>> f(1,2,3)# 多参数也会报错Traceback (most recent call last):  File"<stdin>", line1,inTypeError: f() takes2positional arguments but3were given>>>>>> # 但这可以通过设置参数默认值解决...>>> deff(arg1, arg2=2, arg3=3):... print(arg1, arg2, arg3)...>>> f(1)123>>> f(1,3)133>>> f(1,3,5)135复制代码

「可变参数」,个人理解就是用来解决不确定参数的问题的

>>> defmy_join(sep, *args):... returnsep.join(args)...>>> my_join(', ','apple','pear')'apple, pear'复制代码

args 是一个元组,函数调用时,除掉「位置参数」用掉的参数,剩下的都会按顺序放到这个元组。

「关键字参数」是指以 keyword=value 形式定义的参数

>>> deff(name, age=22, address='cn'):... print('name:', name)... print('age:', age)... print('address:', address)...>>> # 只传一个参数...>>> f('xiaoming')name: xiaomingage:22address: cn>>>>>> # 三个都传...>>> f('xm', age=23, address='us')name: xmage:23address: us>>>>>> # 顺序可以随意...>>> f('xm', address='us', age=23)name: xmage:23address: us>>>>>> # 多了会出问题...>>> f('xm', age=23, address='us',  height='175cm')Traceback (most recent call last):  File"<stdin>", line1,inTypeError: f() got an unexpected keyword argument'height'>>>>>> # 但可以这样解决...>>> deff(name, age=22, address='cn', **extra_info):... print('name:', name)... print('age:', age)... print('address:', address)... print('extra_info:')... forkwinextra_info:... print(kw,':', extra_info[kw])...>>> f('xm', age=23, address='us',  height='175cm')# 搞定name: xmage:23address: usextra_info:height :175cm复制代码

extra_info 是一个字典,由与前面参数对应不上的「关键字参数」组成。

相信很多朋友看到这,都有点疑惑,这「位置参数」和「关键字参数」怎么区分呢?我的理解是不用区分。理由如下

>>> deff(name, age=22, address='cn'):... print('name:', name)... print('age:', age)... print('address:', address)...>>> # 不传参会报错, name 像是一个「位置参数」...>>> f()Traceback (most recent call last):  File"<stdin>", line1,inTypeError: f() missing1required positional argument:'name'>>>>>> # name 当作「关键字参数」也没问题...>>> f(age=23, address='us', name='xm')name: xmage:23address: us复制代码

「位置参数」和「关键字参数」是一个相对的概念,不用去死磕。有的把三个参数都当作「位置参数」,有的把三个参数都当作「关键字参数」,有的把第一个当作「位置参数」,后面两个当作「关键字参数」。理解上其实都没问题,我们只要明白在各种情况下如何使用就好。(不过我个人倾向于最后一种理解)

另外需要注意下相关的两个操作

>>> deff(arg1, arg2, arg3):... print(arg1, arg2, arg3)...>>> # *s 相当于 s 中的元素解包,然后按顺序放到参数列表(s 可以是「序列类型」中的一种)...>>> f(*[1,3,5])# 等同 f(1, 2, 3)135>>>>>> # **d 相当于把 d 中的键值对解包,然后放到参数列表(d 可以是「字典」)...>>> f(**{'arg1':2,'arg2':4,'arg3':6})# 等同 f(arg1=2, arg2=4, arg3=6)246复制代码

最后来个总结,放出本小节的第一个函数定义

defintroduce(name, *hobbies, **extra_info):pass复制代码

当「位置参数」、「可变参数」和「关键字参数」同时存在时,「可变参数」在「关键字参数」之前,「位置参数」在最前。「位置参数」和「关键字参数」没必要强行去区分,有自己的合理理解即可。还有就是理解函数调用时, * 可以用于解包「列表」(或其它「序列类型」),** 可以用于解包「字典」。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容