iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
0
Software Development

python 自學系列 第 13

python day13 (sequence functions)

  • 分享至 

  • xImage
  •  

今天稍微整理一下一些 sequence functions 的操作有 built-in sequence functions、index、slicing 三個部分.也介紹一下 python 的單星號(*) 和雙星號(**)的使用方式.

built-in sequence functions

python 有提供了一些方便處理 sequence 的 function.在前幾篇的範例應該也有提到,不過這邊再整理複習一下.

enumerate

使用 enumerate 可以很方便的直接取得序列的 index 和 value.

>>> nums = [(1,2,3),(4,5,6),(7,8,9)]
>>> for i,v in enumerate(nums):
...  print(i , v)
...
0 (1, 2, 3)
1 (4, 5, 6)
2 (7, 8, 9)

tuple 可以直接用變數去接各元素的值.

>>> for i,(a,b,c) in enumerate(nums):
...  print(i,a,b,c)
...
0 1 2 3
1 4 5 6
2 7 8 9

sorted

sorted 可以對序列排序.

>>> sorted(['f','a','r','A','z','T','o'])
['A', 'T', 'a', 'f', 'o', 'r', 'z']

reversed

反轉序列的順序.reversed 並不會直接產生一組 list.

>>> reversed(['f','a','r','A','z','T','o'])
<list_reverseiterator object at 0x10b973710>
>>> type(reversed(['f','a','r','A','z','T','o']))
<class 'list_reverseiterator'>

使用 help 看一下,回傳的是一個 iterator.

>>> help(reversed)

Return a reverse iterator over the values of the given sequence.

所以必須再搭配 list 轉換.

>>> list(reversed(['f','a','r','A','z','T','o']))
['o', 'T', 'z', 'A', 'r', 'a', 'f']

zip

zip 可以把兩組序列壓縮成一個 zip object.

>>> user_id = [1,2,3]
>>> user_name = ['Daniel','Sam','Jack']
>>> print(zip(user_id , user_name))
<zip object at 0x10b7f2be0>

zip object 可以透過 list 轉換成 tuple list.

>>> user_info = zip(user_id , user_name)
>>> list(user_info)
[(1, 'Daniel'), (2, 'Sam'), (3, 'Jack')]

搭配 enumerate 使用.

>>> user_info = zip(user_id , user_name)
>>> for index,(id,name) in enumerate(user_info):
...  print(index,id,name)
...
0 1 Daniel
1 2 Sam
2 3 Jack

如果沒有重新 zip 時,會發現 user_info 物件是空的,使用 zip 看來回傳的會是 iterator. 因為 iterator 是一次性的,只能迭代一次.

>>> list(user_info)
[]

如果要重複使用,還是先轉成 list 再來迭代.

>>> user_info = list(zip(user_id , user_name))
>>> for index,(id,name) in enumerate(user_info):
...  print(index,id,name)
...
0 1 Daniel
1 2 Sam
2 3 Jack
>>> user_info
[(1, 'Daniel'), (2, 'Sam'), (3, 'Jack')]

如果要 unzip 只要在使用一次 zip 並且在 tuple list 變數前加上 * .

>>> id , names = zip(*user_info)
>>> id
(1, 2, 3)
>>> names
('Daniel', 'Sam', 'Jack')

index & slicing

對於 sequence-like 型態的物件,例如 list、tuple、string, python 提供了兩種可以取得這些物件資料的方式,index 與 slicing.在這篇之前,前面有很多例子都已經有用到這兩種方式.

index

list index.

>>> nums = [1,2,3,4,5]
>>> nums[0]
1

tuple index.

>>> names = ('Daniel','Sam','Tom')
>>> names[1]
'Sam'
>>> names[0]
'Daniel'

字串第一個字元從 0 開始.

>>> 'Daniel'[0]
'D'
>>> 'Daniel'[1]
'a'

比較特別的是給負數值也可以取得元素的內容,用來取最後一個值的時候很方便.但負數值超過長度還是會出錯.

>>> nums[-1]
5
>>> nums[-5]
1
>>> nums[-6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

另外如果有使用到 string format 時,也可以利用 index 來改變 format 的順序.

>>> nums = [(1,2,3),(4,5,6),(7,8,9)]
>>> for i,j,k in nums:
...  print('{1} , {0} , {2}'.format(i,j,k))
...
2 , 1 , 3
5 , 4 , 6
8 , 7 , 9

slicing

index 可以取得序列的某個元素,而 slicing 可以取的序列中的子序列.格式為[起始位置:結束位置:一次跳幾位(預設1)]

>>> nums = [1,2,3,4,5]
>>> nums[0:3]
[1, 2, 3]
>>> nums[:3]
[1, 2, 3]
>>> nums[3:]
[4, 5]
>>> nums[:-3]
[1, 2]
>>> nums[-2:]
[4, 5]
>>> nums[-4:-1]
[2, 3, 4]
>>> nums[0:3:2]
[1, 3]
>>> nums[4:1:-2]
[5, 3]
>>> nums[::2]
[1, 3, 5]
>>> nums[::-2]
[5, 3, 1]
>>> nums[:]
[1, 2, 3, 4, 5]

可以利用下列方式取得 reverse string.

>>> 'Daniel'[::-1]
'leinaD'

* & ** 用途

單星號(*) 用在 function 的參數裡,代表可傳入 0 或多個參數.

>>> def count_sum(num1,*nums):
...  sum = num1
...  for n in nums:
...   sum += n
...  return sum
...
>>> count_sum(5)
5
>>> count_sum(5,1,2)
8

單星號(*) 用在呼叫 function 的話,代表可以把 list 或 tuple 型態的物件展開對應到 function 各自的參數裡.

>>> def count_sum(num1,num2,num3):
...  return num1 + num2 + num3
...
>>> nums = [1,2,3]
>>> count_sum(*nums)
6

如果沒有加上單星號,參數會對不起來出 error.

>>> count_sum(nums)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: count_sum() missing 2 required positional arguments: 'num2' and 'num3'

單星號(*) 還可以用在 unzip 的使用上,上面範例有介紹過.

>>> id , names = zip(*user_info)
>>> id
(1, 2, 3)
>>> names
('Daniel', 'Sam', 'Jack')

雙星號(**) 用在 function 的參數裡,代表 dictionaries.

>>> def count_sum(**nums):
...  sum = 0
...  for num in nums.values():
...   sum += num
...  return sum
...
>>> count_sum(item1=20 , item2=30 , item3=40)
90

雙星號(**) 用在呼叫 function 的話,代表可以把 dictionaries 展開到對應的參數裡.

>>> def count_sum(item1,item2,item3):
...  return item1 + item2 + item3
...
>>> item_list = {'item1':20 , 'item2':30 , 'item3':40}
>>> count_sum(**item_list)
90

如果傳入的 dictionaries key 都沒對應到 function 的參數,則會出現 error.

>>> it_list = {'i1':20 , 'i2':30 , 'i3':40}
>>> count_sum(it_list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: count_sum() missing 2 required positional arguments: 'item2' and 'item3'

記得在 python 3.5 以上雙星號(**) 可以用在 dictionaries 的合併.

>>> {**users , **student}
{'user1': 'Daniel', 'user2': 'Sam', 'student1': 'James', 'student2': 'Ray'}

上一篇
python day12 (Functions)
下一篇
python day14 (File Input、Output)
系列文
python 自學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言