0

## python 撲克牌程式導讀問題(python100day)[已解決]

player.arrange(get_key)我不太理解get_key明明是一個一般函式為什麼可以直接當arrange的參數使用，get_key在程式裡也沒找到其他地方有帶入參數呼叫和所以我很困惑。

import random

class Card(object):
"""一张牌"""

def __init__(self, suite, face):
self._suite = suite
self._face = face

@property
def face(self):
return self._face

@property
def suite(self):
return self._suite

def __str__(self):
if self._face == 1:
face_str = 'A'
elif self._face == 11:
face_str = 'J'
elif self._face == 12:
face_str = 'Q'
elif self._face == 13:
face_str = 'K'
else:
face_str = str(self._face)
return '%s%s' % (self._suite, face_str)

def __repr__(self):
return self.__str__()

class Poker(object):
"""一副牌"""

def __init__(self):
self._cards = [Card(suite, face)
for suite in '♠♥♣♦'
for face in range(1, 14)]
self._current = 0

@property
def cards(self):
return self._cards

def shuffle(self):
"""洗牌(随机乱序)"""
self._current = 0
random.shuffle(self._cards)

@property
def next(self):
"""发牌"""
card = self._cards[self._current]
self._current += 1
return card

@property
def has_next(self):
"""还有没有牌"""
return self._current < len(self._cards)

class Player(object):
"""玩家"""

def __init__(self, name):
self._name = name
self._cards_on_hand = []

@property
def name(self):
return self._name

@property
def cards_on_hand(self):
return self._cards_on_hand

def get(self, card):
"""摸牌"""
self._cards_on_hand.append(card)

def arrange(self, card_key):
"""玩家整理手上的牌"""
#這裡的排序原理是什麼?key為什麼要是card_key
#card_key裡面不是由花色和數字組成嗎
#那這樣cards_on_hand.sort不就可以對字串做排序了

self._cards_on_hand.sort(key=card_key)

#********************這部分除了arrage有呼叫到以外但呼叫了不用帶入參數呼叫嗎?
# 排序规则-先根据花色再根据点数排序
def get_key(card):
return (card.suite, card.face)

def main():
p = Poker()
p.shuffle()
players = [Player('东邪'), Player('西毒'), Player('南帝'), Player('北丐')]
for _ in range(13):
for player in players:
player.get(p.next)
for player in players:
print(player.name + ':', end=' ')
#***我困惑的地方
player.arrange(get_key)
print(player.cards_on_hand)

if __name__ == '__main__':
main()

https://github.com/jackfrued/Python-100-Days/blob/master/Day01-15/09.%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%BF%9B%E9%98%B6.md

### 1 個回答

2
froce
iT邦大師 1 級 ‧ 2021-04-27 13:39:01

https://docs.python.org/zh-tw/3/howto/sorting.html#key-functions

1. 在python函數是頭等公民，可以被當參數傳，而且很多時候會需要
2. 考慮下面的code，請問兩個各叫什麼
def abc(d=""):
return "abc"+d

print(type(abc))
print(type(abc()))
1. 為啥會需要這樣傳？比如爬蟲，我今天爬到後原始資料有20000筆，欄位20個，我不希望用資料庫，但我原始資料和過濾後的資料都要，而且過濾的條件都不同，那我是不是需要一個靈活的方法去過濾資料？
通常這種方式叫 callback。

froce iT邦大師 1 級 ‧ 2021-04-29 08:33:27 檢舉

def get_key(card):
return (card.suite, card.face)

l1 = [1, "2"]
l2 = [Card("♠", 1), Card("♠", 2)]

l1.sort(key=get_key)
l2.sort(key=get_key)

get_key裡並沒有強制限定你參數類型，那個card只是在提示你（撰寫程式者）他吃Card，你list裡要放什麼東西，你要餵它什麼，他管不到，頂多是他消化不良吐error而已。