1-1 一摞有风格的纸牌之一摞

写在前面

昨天学习了怎么用namedtuple()方法生成一张纸牌的类。今天继续学习怎么生成一摞纸牌。

一摞有风格的纸牌之一摞

流畅的Python中给出的第一个例子是一摞有序的纸牌:

import collections

# 一摞有序的纸牌

Card = collections.namedtuple(‘Card‘, [‘rank‘, ‘suit‘])

class FrenchDeck:
    ranks = [str(n) for n in range(2,11)] + list(‘JQKA‘)
    suits = ‘spades diamonds clubs hearts‘.split()

    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]

    def __len__(self):
        return len(self._cards)

    def __getitem__(self, position):
        return self._cards[position]

上一节学习了Card类,这一节看一下FrenchDeck中的内容。

ranks是一个列表,在这个列表中,共有13个字符,为2到11和‘JQKA’,这就是列表表达式。

suits是一个代表扑克牌4中花色的列表,这个列表是通过切割字符串得到的。

初始化方法中,对一摞纸牌进行了初始化,并赋值给self._cards,这里为什么要加下划线呢?意义在哪里?

import collections
Card = collections.namedtuple(‘Card‘, [‘rank‘, ‘suit‘])

ranks = [str(n) for n in range(2,11)] + list(‘JQKA‘)
suits = ‘spades diamonds clubs hearts‘.split()

cards = [Card(rank, suit) for suit in suits for rank in ranks]
for r, s in cards:
    print({r: s})
>>>
{‘2‘: ‘spades‘}
{‘3‘: ‘spades‘}
{‘4‘: ‘spades‘}
...
{‘Q‘: ‘hearts‘}
{‘K‘: ‘hearts‘}
{‘A‘: ‘hearts‘}

说明:单下划线开头的变量,标明是一个受保护(protected)的变量,原则上不允许直接访问,但外部类还是可以访问到这个变量。这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。

FrenchDeck类中的__len__()方法是一个特殊方法,获取这摞扑克牌的长度,及统计共有多少张扑克牌。

FrenchDeck类中的__getitem__()方法也是一个特殊方法,用以获取这摞扑克牌中的一张扑克牌。

思考

  • 怎么获取这摞扑克牌中的第一张,第10张,最后一张?
  • 怎么随机获取一张扑克牌?--需要导入:random.choice
  • 怎么对扑克牌进行切片操作?
  • 怎么对扑克牌进行迭代操作,打印出所有的扑克牌?

写在后面

学习了这节内容,第一反应是,哇哦~我可以用Python写出99乘法表了,心动不如行动:

# 99乘法表
from collections import namedtuple
Rank = namedtuple(‘Rank‘, [‘row‘, ‘column‘])

table = [Rank(row, column) for row in range(1,10) for column in range(1, 10)]
print(table)
for row, column in table:
    # print("%d*%d=%2d" % (row, column, row * column), end=‘ ‘)
    print(row * column, end=‘ ‘)
    # OMG 怎么打印出99乘法表的格式呢?
    if column == 9:
        print("")

>>>
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

最后的结果如上,但是这不是我想要的啊,我想要的是小时候文具盒上那样的:

TIPS: 这个故事告诉我们,你以为你会了,其实你还什么都不会。

时间: 2024-10-21 21:54:33

1-1 一摞有风格的纸牌之一摞的相关文章

1-1 一摞有风格的纸牌之一张纸牌

写在前面 流畅的Python第一章的主题是讲数据模型.Python中的数据模型是指什么呢?Honestly,我也不知道. 虽然潜意识中认为所谓数据模型是指对数据的处理及构建,那具体的处理和构建方式又是什么呢?希望学习到后期,我能对这个概念深入且能手到擒来地侃侃而谈. 一摞有风格的纸牌 流畅的Python中给出的第一个例子是一摞有序的纸牌: import collections # 一摞有序的纸牌 Card = collections.namedtuple('Card', ['rank', 'su

流畅的python2015pdf

[下载地址] [技术大咖推荐] "很荣幸担任这本优秀图书的技术审校.这本书能帮助很多中级Python程序员掌握这门语言,我也从中学到了相当多的知识!"--Alex Martelli,Python软件基金会成员 "对于想要扩充知识的中级和高级Python程序员来说,这本书是充满了实用编程技巧的宝藏."--Daniel Greenfeld和Audrey Roy Greenfeld,Two Scoops of Django作者 [本书特色] 本书由奋战在Python开发一

《流畅的Python》高清PDF电子版附源代码下载

本书特色本书由奋战在Python开发一线近20年的Luciano Ramalho执笔,Victor Stinner.Alex Martelli等Python大咖担纲技术审稿人,从语言设计层面剖析编程细节,兼顾Python 3和Python 2,告诉你Python中不亲自动手实践就无法理解的语言陷阱成因和解决之道,教你写出风格地道的Python代码. ● Python数据模型:理解为什么特殊方法是对象行为一致的关键. ● 数据结构:充分利用内置类型,理解Unicode文本和字节二象性. ● 把函数

你有哪些用计算机技能解决生活问题的经历?

程序猎人 ,2002年开始程序员生涯.工作以外喜欢做些… 409 人赞同 做医院的项目,产品上线之前,为了让医院的工作人员体验一下新系统,我们的传统是要组织医院的人员进行一次到两次彩排.在彩排中发现的问题,会让参加的人写在反馈表上提交上来.最近一次参加的彩排,医院的人员都很认真地参与了进来,为了模拟眼睛不好的患者,还特意带上了故意做成雾蒙蒙的眼镜:为了模拟行动不便的患者,特地穿上了限制腿脚行动的衣服……参加完彩排,那些人也很认真地填写反馈表.导致前前后后收上来上千张纸. 反馈表收上来之后,有专人

hdu 1528-Card Game Cheater(贪心算法)

题意不讲,怕说不清,自己一点点看吧. 思路是贪心,将每个人的牌按从小到大或(从大到小),我是从小到大排的, 然后每次从第二摞排中找比第一摞排的那张大且相差最小的就可以了,每次找到就sum++: 最后sum值就是最优的(贪心思想). 1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<stdlib.h> 5 #include<string.h> 6 #i

每天一道博弈论之“E&amp;D”

题意: 给你n组石子,每组有两摞.操作为选其中一摞石子分成两摞,抛弃原来同一组的另一摞石子,直到无法操作.问给你这n组石子,问先手胜还是后手胜. (比如(10,8,),你可以将10分为(5,5),那么这一组石子就成了(5,5),那个8就可以不用管了) 题目链接:https://www.luogu.org/problemnew/show/P2148 题解: 其实这道题我也不是很会,看了题解才写出来T_T 首先每组是独立的,可以求出每一组的SG值然后用SG定理解决. 那么每组的SG值怎么求呢? 好像

题解【[USACO05NOV]奶牛玩杂技】

\[ \texttt{Description} \] 有 \(n\) 头牛,每头牛都有自己的体重 \(W_i\) 和力量 \(S_i\) . 将这 \(n\) 头牛摞在一起,每头牛的压扁指数定义为:压在该牛上面的牛的体重之和 \(-\) 该牛力量 . 您需要找到一种摞牛方案,使得压扁指数最大的牛的压扁指数最小. 求这个压扁指数. \[ \texttt{Solution} \] 微扰(邻项交换)证明贪心好题. 考虑任意一个摞牛方案,设该摞牛方案中,从顶端往底端数的第 \(i\) 头牛的体重为 \(

洛谷 P1031 均分纸牌

P1031 均分纸牌 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上:在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上:其他堆上取的纸牌,可以移到相邻左边或右边的堆上. 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多. 例如 N=4,4 堆纸牌数分别为: ①9②8③17④6 移动3次可达到目的: 从 ③ 取

【贪心】【codevs】1098 均分纸牌

http://codevs.cn/problem/1098/ Q:N摞纸牌,每摞纸牌张数随机,每摞纸牌只能移动到相邻的纸牌摞上去,求最小的移动次数,使得每摞纸牌的张数一致. A:从头到尾扫一遍,只要当前这摞纸牌的张数不是每摞牌最终应该达到的平均值,就将其多的或少的纸牌移动或取自下一摞纸牌,同时将移动次数加1 #include<bits/stdc++.h> using namespace std; int p[105]; int n; int sum, avg; int ans; int mai