好冷的Python–tuple和逗號的糾纏

2021-02-20 桔子code

在 《Python混合編程–C語言接口ctypes(1)》中講到封裝C函數時的argstype ,以及在《Python進階–多線程》 中講到創建線程實例時傳遞函數入參args,如果參數只有一個時,這一個元素之後必須要增加一個逗號「,」,否則就會拋TypeError異常。

我們接下來看看為什麼一定要加上這個顯得多餘的逗號,既然拋TypeError異常了,我們就用type()來看下它們的差異。

如果是一個不包含任何元素的」()」,其類型妥妥的是一個tuple :

>>> a = ()>>> type(a)<type 'tuple'>>>>

當小括號內部僅有一個整數而沒有添加逗號時,類型卻是int:

>>> a = (1)>>> type(a)<type 'int'>>>>

當小括號內部僅有一個整數且該整數後有逗號時,它的類型又變回了tuple:

>>> a = (1,)>>> type(a)<type 'tuple'>>>>

這種形式上的不一致性就會導致我們在編寫程序時,如果遇到只有一個元素的tuple,容易忘記加上逗號,從而導致程序拋異常。

再來看個例子,這段程序本意是要計算1,2,3 三個數值的和:

def add(x,y):    return x+y,
print('微信公眾號:桔子code')a = 1b = 2c = 3sum = add(a,b)sum = sum + cprint('sum=',sum)

==========運行結果:
微信公眾號:桔子code
Traceback (most recent call last):
File "E:\juzicode\pycold\tuple-test.py", line 9, in <module>
sum = sum + c
TypeError: can only concatenate tuple (not "int") to tuple

運行文件居然拋異常了,提示「sum = sum + c」 這一行中有TypeError,意思是只能用tuple和tuple相加,不能用int和tuple相加。

what?

a和b相加是個int數據,再和c相加,這裡明明是int和int相加,怎麼提示是int和tuple相加, 「sum = sum + c」 這一行中c是int無疑了,難道這裡sum是個tuple?改下程序,列印add()函數的返回值sum的類型看看:

def add(x,y):    return x+y,
print('微信公眾號:桔子code')a = 1b = 2c = 3sum = add(a,b)print('type of sum',type(sum))sum = sum + cprint('sum=',sum)

==========運行結果:
微信公眾號:桔子code
type of sum <class 'tuple'>
Traceback (most recent call last):
File "E:\juzicode\pycold\tuple-test.py", line 10, in <module>
sum = sum + c
TypeError: can only concatenate tuple (not "int") to tuple

果不其然,add()返回值果然是個tuple,往回看func的return值,問題就在這裡:「return x+y,」 ,最後面多了個逗號「,」,我們知道函數return形式上可以返回多個值,多個值之間用逗號分隔,實際上返回的是個tuple。我們通常用「()」來定義tuple,但也可以不使用「()」,而是直接用多個逗號將各元素間隔的方式來定義一個tuple:

>>> a = 1,2,3>>> type(a)<type 'tuple'>>>>>>> a = 1,>>> type(a)<type 'tuple'>

從上面的例子可以看出如果這麼定義變量:

實際上a是一個tuple。

回到前面挖的坑,「 return x+y, 」 實際上返回的是一個tuple,所以才導致了拋異常提示不能用int和tuple相加。

Python雖強大,使用需小心!一個不起眼的逗號該有的時候卻沒有,或者不該有的時候卻出現了,都可能會浪費你很長的時間去「抓蟲子」。

關注微信公眾號"桔子code",不錯過更冷的Python知識。

相關焦點

  • Python的List與Tuple
    列表是寫在方括號([])之間、用逗號分隔開的元素列表。和字符串一樣,列表同樣可以被索引和截取,列表被截取後返回一個包含所需元素的新列表。列表截取的語法格式如下:變量[頭下標:尾下標]索引值以 0 為開始值,-1 為從末尾的開始位置。加號(+)是列表連接運算符,星號(*)是重複操作。
  • Python數據類型之元組tuple
    # 元組(tuple)是 Python 中另一個重要的序列結構,和列表類似,元組也是由一系列按特定順序排序的元素組成。
  • 2.1 Python基礎知識(List和Tuple)
    一、List類型1.python創建List說明:Python內置的一種數據類型是列表:list。list是一種有序的集合,可以隨時添加和刪除其中的元素。構造list非常簡單,按照上面的代碼,直接用 [ ] 把list的所有元素都括起來,就是一個list對象。由於Python是動態語言,所以list中包含的元素並不要求都必須是同一種數據類型。
  • Python入門14-元組tuple
    另一種有序列表叫元組(tuple)。tuple和list非常類似,但是tuple一旦初始化就不能修改。
  • 元組(tuple)-Python基本數據類型之四
    在python中,元組這種數據結構同列表類似,都可以描述一組數據的集合,它們都是容器,是一系列組合的對象,不同的地方在於,元組裡的元素是不能更改的,它們之間的差異性我們用一個例子來說明一下:列表:06",10,135.7)>>> print(student[1]) #輸出 tom從上面的比較例子可以看出,列表一般用於不確定個數的數據的集合中,例如上面,並不知道能找到多少個txt文件,所以用列表來表示,而元組一般用於描述一個東西的特性,例如上面的例子,描述了一個學生的學號、姓名、出生年月、年齡和身高
  • 數據類型介紹——tuple、list和range對象
    )(1)定義元組元組使用圓括號「()」與逗號「,」來創建,同樣可以包含任意數據類型,其定義方法主要有以下幾種:In [15]: 1,'python',2.3In [16]: tuple_1Out[16]: (1, 'python', 2.3)也可以由括號直接定義:
  • python中namedtuple與OrderedDict 的使用
    今天來講解一下python中的 Namedtuple與OrderedDict 的使用。一、Namedtuple我們都知道,在python的數據結構裡,tuple(元組)表示的是不可變集合。那麼,nametuple就派上了用場:from collections import namedtuplePoint = namedtuple('Point', ['x', 'y'])p = Point(1, 2)p.xp.y如果用坐標和半徑表示一個圓,也可以用nametuple來定義:#namedtuple('名稱', [屬性list]):Circle =
  • Python基礎篇——關於元組(tuple)和列表(list)區別
    一、前言在Python數據類型中有兩個對象:元組 tuple 和列表 list 。二者寫法和用法十分相似,有的同學就會去網上查找它們之間的區別,查到的無非以下幾種說法:list 是可變的,元組 tuple 是不可變的。由於 tuple 不可變,所以使用 tuple 可以使代碼更安全。等等 ...
  • Python基礎數據類型——tuple淺析
    有序列表叫元組:tuple。tuple和list非常類似,但是tuple一旦初始化就不能修改。二、用法1. tuple元組的定義Python的元組與列表類似,不同之處在於元組的元素不能修改。元組使用小括號,列表使用方括號。
  • 11-python中的元組
    代碼示例:t = ('小潭', '學', 'python', 666)print('使用()創建:', t, type(t))t2 = '小潭', '學', 'python', 666print('可省略():', t2, type(t2))t1 = tuple(('小潭', '學', 'python', 666))print
  • Python3的基本類型元組tuple(瘋狂Python)
    2 元組的創建:只需要在括號中添加元素,並使用逗號隔開即可。測試代碼如下(在Ipython環境下操作,後續無特殊說明,都是在該環境下)In [1]: #測試代碼:In [2]: tuple1 = ('baidu', 'baidu.com','baiduAI')In [3]: tuple2 = (1, 2, 3, 4)In [4]: tuple3 = "A", "B", "C" #不加括號也可以In [5]: type(tuple3
  • python學習|tuple數據結構詳解
    tuple1 = (1,2)print(tuple1)tuple2=(1,2,"qzq")print(tuple2)# 元組只有一個元素時,需要加一個逗號tuple3=(1,)print(tuple3)# 第1個元素數字
  • 從零開始學Python-Day9-集合list和元組tuple
    tuple的不可變性強調了數據的安全性,對於不需要用戶交互變化的量,最好用tuple,能不用list就不用。空tuple和1個元素的tuple如果需要定義一個空的tuple,可以寫作()如果是定義只有一個元素的的tuple,需要在單獨元素的後面加一個逗號, 否則就變成了給花名冊這個變量單獨賦值,因為這裡()等同於數學裡的小括號,Python規定這種情況下按數學的小括號計算
  • python3.6中數據類型之list和tuple的比較
    list使用中括號,有序,可修改其中的數值tuple使用小括號,有序,不可修改其中的數值我們分別定義一個list,一個tuple.python在這裡的門門道道還是比較多的。1:下標制比如上面定義的LIST.計算機裡面的標籤是這樣的list =[list[0],list[1],list[2],list[3]]或者list=[list[-4],list[-3],list[-2],list[-1]]比如我們需要完整輸出。
  • 解密Python中的args和kwargs
    解密Python中的args和kwargs本文來源:https://realpython.com/python-kwargs-and-args/翻譯:老齊與本文內容配套的圖書:《跟老齊學Python:輕鬆入門》、《Python大學實用教程》。各大電商平臺有售。
  • 【Python基礎】Python的元組,沒想像的那麼簡單
    可以用多種方式構建元組,主要有以下四種,每個都會有相應的案例:使用一對圓括號來表示空元組: ()使用一個後綴的逗號來表示單元組: a, 或 (a,)使用以逗號分隔的多個項: a, b, c or (a, b, c)
  • Python數據類型串講(中)
    python中的內建序列有6種:列表、元祖、字符串、Unicode字符串、xrange對象、buffer對象,其中列表和元祖是最常見的序列,應重點掌握。字符串在上一篇文章中已簡單介紹,下面將以字符串為例,對序列的通用操作進行詳講。
  • Python基礎知識(八)
    一、元組1、簡介python 作為一個發展中的語言,也提供了其他的一些數據類型。tuple也是 python 中一個標準的序列類型。
  • datatype在python專題及常見問題 - CSDN
    複數由實數部分和虛數部分構成,可以用 a + bj,或者 complex(a,b) 表示, 複數的實部 a 和虛部 b 都是浮點型。內部元素用逗號,且不能二次賦值,相當於只讀列表。tuple_list = ('hello', 786, 2.23, 'world', 70.2)add_tuple = (123, 'python')print(tuple_list) # 輸出完整元組print(tuple_list[0] ) # 輸出元組的第一個元素print(tuple_list[1:3]
  • 了解這些python數據結構,你也可以進BAT
    http://c.biancheng.net/python/str_method/大家可以複製連結到瀏覽器打開,裡面詳細講了字符串的各種方法和應用,建議詳讀、精讀。如果對字符串深入學習感興趣的話,可在文章下留言,下次我將專門寫一篇關於python字符串的文章。