鱼C论坛

 找回密码
 立即注册
查看: 3871|回复: 12

最近在看书自学Python。。遇到问题求助

[复制链接]
发表于 2016-8-24 12:56:46 | 显示全部楼层 |阅读模式
40鱼币
本帖最后由 碗碗的泡菜坛 于 2016-8-24 12:56 编辑

最近在看一本叫《Fluent Python》的书

据说这是进阶教程。。。学了零基础都快忘完了的我表示各种吃力

里面有这么一个例子:

  1. import collections
  2. Card = collections.namedtuple('Card', ['rank', 'suit'])

  3. class FrenchDeck:
  4.     ranks = [str(n) for n in range(2, 11)] + list('JQKA')
  5.     suits = 'spades diamonds clubs hearts'.split()
  6.    
  7.     def __init__(self):
  8.         self._cards = [Card(rank, suit) for suit in self.suits
  9.                                         for rank in self.ranks]
  10.     def __len__(self):
  11.         return len(self._cards)
  12.     def __getitem__(self, position):
  13.         return self._cards[position]
复制代码


这段代码能看懂
代码运行后:
屏幕快照 2016-08-24 下午12.46.34.png
屏幕快照 2016-08-24 下午12.46.38.png
屏幕快照 2016-08-24 下午12.46.42.png
也都看懂了

但是!!!!
下面这段死活看不懂啊
屏幕快照 2016-08-24 下午12.46.45.png

我去查了random.choice  得知这个方法用于随机抽取可迭代对象里的某个元素。
我还查到,先from collections import Iterable
然后isinstance(object,Ierable)
如果返回True就是可迭代对象

所以我就试试 deck 是不是可迭代对象
  1. >>> from collections import Iterable
  2. >>> isinstance(deck,Iterable)
  3. False
  4. >>>
复制代码


啥!!!!!

其实我也觉得FrenchDeck的实例不会是可迭代对象啊!!!!!
这个FrenchDeck类又没有继承什么可迭代的类型(如列表之类的)
只有一个实例属性_cards是个列表!!!!
可是不代表FrenchDeck的实例是列表啊!!!
所以为啥实例deck可以用random.choice呢!!!

最佳答案

查看完整内容

这是random模块的源码,就是生成个随机数 -------- iterable …… objects of any classes you define with an __iter__() or __getitem__() method. …… The for statement does that automatically for you, creating a temporary unnamed variable to hold the iterator for the duration of the loop. -------- 可迭代性: 定义了 __iter__() 或 __getitem__() 方法的对象。 for 语句会自动创建匿名迭代器 ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-24 12:56:47 | 显示全部楼层
碗碗的泡菜坛 发表于 2016-8-24 14:33
self.randbelow是什么。。。


这是random模块的源码,就是生成个随机数

--------
iterable
……
objects of any classes you define with an __iter__() or __getitem__() method.
……
The for statement does that automatically for you, creating a temporary unnamed variable to hold the iterator for the duration of the loop.

--------
可迭代性:
定义了 __iter__() 或 __getitem__() 方法的对象。
for 语句会自动创建匿名迭代器。

认真看3
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-24 13:06:15 | 显示全部楼层

评分

参与人数 1荣誉 +1 收起 理由
碗碗的泡菜坛 + 1 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-24 13:32:51 | 显示全部楼层
    def choice(self, seq):
        """Choose a random element from a non-empty sequence."""
        try:
            i = self._randbelow(len(seq)) # __len__
        except ValueError:
            raise IndexError('Cannot choose from an empty sequence')
        return seq[ i ]  #  __getitem__

choice 的源码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-24 13:47:39 | 显示全部楼层
简化一下:
  1. >>> for i in deck:
  2.         print(i)

  3.        
  4. Card(rank='2', suit='spades')
  5. Card(rank='3', suit='spades')
  6. Card(rank='4', suit='spades')
  7. Card(rank='5', suit='spades')
  8. Card(rank='6', suit='spades')
  9. Card(rank='7', suit='spades')
  10. Card(rank='8', suit='spades')
  11. Card(rank='9', suit='spades')
  12. 。。。。。。。。。。。。。。
  13. Card(rank='A', suit='hearts')
复制代码

这样看deck似乎是可迭代的。

评分

参与人数 1荣誉 +1 收起 理由
碗碗的泡菜坛 + 1 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-24 14:25:22 | 显示全部楼层
冬雪雪冬 发表于 2016-8-24 13:47
简化一下:

这样看deck似乎是可迭代的。

是的 问题是我想不通这个类的实例为什么可以迭代
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-24 14:33:27 | 显示全部楼层
SixPy 发表于 2016-8-24 13:32
def choice(self, seq):
        """Choose a random element from a non-empty sequence."""
       ...

self.randbelow是什么。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-24 14:50:06 | 显示全部楼层
SixPy 发表于 2016-8-24 14:41
这是random模块的源码,就是生成个随机数

--------

3楼我认真看了啊
objects of any classes you define with an __iter__() or __getitem__() method 看到这句以后我终于明白了
感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-24 14:54:18 | 显示全部楼层
SixPy 发表于 2016-8-24 12:56
这是random模块的源码,就是生成个随机数

--------

另外顺便问choice的原码在哪里找到的,我去官方文档找只能找到文字介绍
另外self._randbelow是个方法啊还是个属性??定义呢?我还是没看懂这个
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-24 15:02:55 | 显示全部楼层
从这句看生成的是可迭代的
  1.     def __getitem__(self, position):
  2.         return self._cards[position]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-8-24 15:03:18 | 显示全部楼层
Help on method choice in module random:

choice(seq) method of random.Random instance
    Choose a random element from a non-empty sequence.


'''
只要是non-empty sequence(非空序列)均可
3楼贴出了choice的代码,应重点看return语句
return seq[ i ]
而 i 是随机选出的,也就是说
只要可以用seq[i]表示的序列(sequence)均可
最后不要忘了non-empty
'''
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-24 15:07:05 | 显示全部楼层
Looker 发表于 2016-8-24 15:03
Help on method choice in module random:

choice(seq) method of random.Random instance

谢谢 不过我后来发现不仅是非空序列 只要可迭代的都可以
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-24 15:07:47 | 显示全部楼层
冬雪雪冬 发表于 2016-8-24 15:02
从这句看生成的是可迭代的

懂啦 我太久没用Python忘记了。。。囧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-22 09:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表