• 风萧萧
    2018-06-08
    请问下,发现 zodiac_len = len(list(zodiac_day)) % 12 最后无论是否求余,结果都是一样,那这样的意义是什么。

    另一个问题是在 Python 中,求余和取模是相同的吗?我看官方文档里面是用 Remainder,而不是 Modulo;但在搜索时有看到一种说法,在计算 a % b 时,如果两者符号不同,那求余运算结果符号和 a 相同,而取模则和 b 相同,如按后则所言,Python 中的 % 应为取模。

    作者回复: 第一个问题,这里使用 %12 取模的原因是当输入的元组范围大于12月23日,取得的元组长度为12
    在python中有12个元素的元组下标是0-11,而不是我们常见的1-12,因此使用和12求模的方式
    避免下标越界,可以去掉%12就能看的运行结果的区别了,可以参考如下例子
    a = (1, 2, 3, 4, 5, 6)
    print(len(list(a))) # 输出结果是6
    a[6] # 抛出异常,下标越界了 IndexError: tuple index out of range
    len(list(a))%6 # 和6求模运算,输出0
    a[0] # 取第一个元素 1

    第二个问题,取模(mod)和求余(rem)是不同的,但因为大部分编程语言里,都使用%表示取模和求余,导致大家混淆了它们的用法。正如你看到的结论一样,在a % b 运算中,如果 a、b符号相同,取模和求余结果相同;如果符号不同,取模和求余的结果是不同的,比如C语言的%就是求余,Python语言的%就是取模。

    
     29
  • HBC
    2018-06-07
    zodiac_day = filter(lambda x: x <=(month, day), zodiac_days)

    print(zodiac_day)

    print(len(list(zodiac_day)))

    print(zodiac_day)

    print(list(zodiac_day))

    执行结果:
    <filter object at 0x101fe83c8>
    4
    <filter object at 0x101fe83c8>
    []

    第二次调用的时候,zodiac_day 成空了,
    filter类型被调用一次之后会被清空??
    展开

    作者回复: 这位同学非常的细心,第二次调用返回的确是空值。
    这里使用的filter()函数的返回类型叫迭代器,它是我们后面要讲的一种函数功能。
    filter函数返回的内容类似一根长长的管子,里面按顺序依次存好要输出的元素,使用list()函数可以一次性将管子里的数据都取出来,第二次再去取管子中自然是空的了。
    当然也可以使用__next__()函数每次只取一个元素,根据业务的需要来编写。

    import time

    num = [1, 2, 3, 4, 5, 6]
    a = iter(num) # 把列表转换成迭代器
    # 对比一下num 和 a的类型
    print(type(num))
    print(type(a))
    # 输出
    print(list(a)) # 一次返回所有内容
    print(list(a)) # 空了

    # 同样功能的filter()函数
    b = filter(lambda x: x <= 5, num)
    print(b.__next__()) # 取第一个
    print(b.__next__()) # 取第二个
    print(list(b)) # 全取出来
    time.sleep(1) # 停1秒方便观察
    b.__next__() # 返回一个StopIteration异常,告诉用户已经没有可以取得内容了

    
     8
  • 张
    2018-06-10
    返回摩羯座的那个,如果使用演示代码(如下):
    zodiac_day = filter(lambda x: x<=(month, day), zodiac_days)
    就会出现问题,如果在 filter 前面套上 list(),就可以正常显示(如下):
    zodiac_day = list(filter(lambda x: x<=(month, day), zodiac_days))

    作者回复: 这里使用的filter()函数的返回类型叫迭代器,它是我们后面要讲的一种函数功能。
    filter函数返回的内容类似一根长长的管子,里面按顺序依次存好要输出的元素,使用list()函数可以一次性将管子里的数据都取出来,第二次再去取管子中自然是空的了。
    当然也可以使用__next__()函数每次只取一个元素,根据业务的需要来编写。

    import time

    num = [1, 2, 3, 4, 5, 6]
    a = iter(num) # 把列表转换成迭代器
    # 对比一下num 和 a的类型
    print(type(num))
    print(type(a))
    # 输出
    print(list(a)) # 一次返回所有内容
    print(list(a)) # 空了

    # 同样功能的filter()函数
    b = filter(lambda x: x <= 5, num)
    print(b.__next__()) # 取第一个
    print(b.__next__()) # 取第二个
    print(list(b)) # 全取出来
    time.sleep(1) # 停1秒方便观察
    b.__next__() # 返回一个StopIteration异常,告诉用户已经没有可以取得内容了

    
     4
  • iam.wang
    2018-06-10
    #练习四,元组基本操作

    tuple1 = ((6,10),(6,11),(6,12)) #定义第一个元组

    tuple2 = ((6,13)) #定义第二个元组

    tuple3 = tuple1.__add__(tuple2) #发现元组tuple3是((6,10),(6,11),(6,12),6,13)

     #如果想将元组写成((6,10),(6,11),(6,12),(6,13)),需要定义tuple2=((6,13),)

    print(len(tuple3))

    print(tuple3)
    展开

    作者回复: NICE!能够自己发现并解决只有一个元素的元组问题非常棒,可以自己尝试用type()print()查看和输出一下,带,和不带,的区别

    
     4
  • _
    2019-06-27
    zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座',
                   u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')
    zodiac_days = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22),
                   (7, 23), (8, 23), (9, 23), (10, 23), (11, 23), (12, 23))

    (mouth, day) = (4, 3)

    zodiac_day = filter(lambda x: x <= (mouth, day), zodiac_days)
    print(zodiac_day)

    # print(list(zodiac_day))

    # print('当前长度:' + str(len(list(zodiac_day))))

    zodiac_len = len(list(zodiac_day)) % 12
    print(zodiac_name[zodiac_len])

    注释的去掉后,得到的答案就不是白羊座了,就是魔蝎了,请问为什么?
    展开

    作者回复: filter() 对象取出来的内容,可以当作是”一次性“的,list()操作之后,里面就是空值,所以每次得到的结果不同

    
     2
  • 菜鸟007
    2018-08-23
    你好,请教个问题,为什么相同的代码,我的结果出来的是摩羯座,看了下list结果是(1,20),len的结果是0

    作者回复: 可能在某些缩进上不同,导致执行的顺序有差异,可以先使用print函数打印上一步的执行结果,观察输出是否按你的思路执行的

    
     1
  • Megahertz
    2018-08-08
    zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座',
                   u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')
    zodiac_days = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22),
                   (7, 23), (8, 23), (9, 23), (10, 23), (11, 23), (12, 23))

    # 列表存储数据可以变更,元组一般是不可变更的数据
    (month, day) = (2, 15)

    zodiac_day = filter(lambda x: x <= (month, day), zodiac_days)
    # Fix Me: 这行不注释,为什么结果就是摩羯座?
    # print(list(zodiac_day))

    zodiac_len = len(list(zodiac_day)) % 12
    print(zodiac_name[zodiac_len])
    展开

    作者回复: 使用type()查看一下zodiac_day会发现它的类型是一个迭代类型,当你去取迭代类型的数据时,相当于把里面的内容拿走了,它存储的内容为空,自然统计长度变成第一个,即你看到结果。

    
     1
  • lus
    2018-06-18
    '''说到比较每个日期才能判断星座,所以我想到了for语句。在输入各种日期试的时候,遇到了各种微小问题以一一排除、不过还不够细,比如月份天数小于30天的、暂时没管、就是下面这个了。。'''
    print("======判断月份的星座=======")
    xingzuo = ("魔羯座","水瓶座","双鱼座","白羊座","金牛座","双子座","巨蟹座", "狮子座","处女座","天秤座","天蝎座","射手座","魔羯座")
    xingzuo_riqi = ((12,22),(1,20),(2,19),(3,21),(4,21),(5,21),(6,22),(7,23),(8,23),(9,23),(10,23),(11,22),(12,22),(12,32))
    a = int(input("Please enter the month:"))
    b = int(input("Please enter the day:"))
    while b > 31 or a > 12:
        print("Emm,please enter a right riqi.")
        break
    riqi = (a,b)
    for n in range(0,13):
        #print(n)
        if riqi<xingzuo_riqi[1]:
            print("The xingzuo is 摩羯座")
            break#如果不break这个循环,那这个循环会循环13次,因为日期小于任何一个元祖中的日期。
        if riqi >= xingzuo_riqi[n] and riqi < xingzuo_riqi[n+1] :
            print("The xingzuo is",xingzuo[n])
    展开

    作者回复: 这里使用星座这个案例是因为学习的一般规律是,根据熟悉的事物迁移到不熟悉的事物;设置的元组嵌套也是为了在没有学习for循环之前可以依次处理每个元素。在你已经掌握for循环时可以考虑处理生活中更多的需要序列类型保存的实际文本,不必拘泥于星座生肖的判断。当然了细心是非常重要的,能够精确控制自己的程序,对用户的输入做准确判断是程序员的必备技能之一,继续加油吧!

    
     1
  • Geek_698071
    2020-02-09
    zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座',
                   u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')

    zodiac_days = ((1, 20),(2, 19),(3, 21),(4, 21),(5, 21),(6, 22),
                   (7, 23),(8, 23),(9, 23),(10, 23),(11, 23),(12, 23))

    #(month, day) = (11, 10)
    (month, day) = map(int,input('输入生日月份和日期,用空格隔开').split())

    zodiac_day = filter(lambda x: x <= (month, day), zodiac_days)

    zodiac_len = len(list(zodiac_day)) % 12

    print(zodiac_name[zodiac_len])
    展开
    
    
  • 郭进
    2020-02-06
    # 元组的基本操作

    # 定义一个任意元组,对元组使用append() 查看错误信息
    aTuple = (1, 2, 'a', 'b', 'c')
    aTuple.append(100)

    # 访问元组中的倒数第二个元素
    print(aTuple[-2])

    # 定义一个新的元组,和 1. 的元组连接成一个新的元组
    bTuple = (3, 4, 'd', 'e')
    print(aTuple + bTuple)

    # 计算元组元素个数
    print(aTuple.__len__())
    print(len(bTuple))
    展开
    
    
  • 历史课代表
    2020-01-21
    zodiac_len = len(list(zodiac_day)),在这句代码之前加上一句打印语句:print(list(zodiac_day));然后zodiac_len的值就一直是0,这是为什么?

    作者回复: 注意一下zodiac_day的类型,它的返回值是“生成器类型”,它的特点是逐个取出,取出之后里面的内容就是“空的”了。

    
    
  • LJY
    2019-12-18
    请问老师(month,day)是一种命名方式吗

    作者回复: 不是命名方式,是一种数据类型,就像字符串、整数、列表、字典一样,例如 “123”就是把123当做字符串处理 ,直接使用 123 就是一个整数类型

    
    
  • 小位
    2019-11-05
    老师,我有个问题,为什么星座的输入月份和日期要用元组的嵌套?
    还有个问题,用元组嵌套这种方式,好像并没有包含每个月的所有日期?

    作者回复: 这里演示更多是为了元组而用元组,其实元组有很多更号的用处的,比如可以作为字典的key,作为函数的返回值, 这类“需要不可变”的类型时来使用,因为初次接触所以用它来存了月份和日期,没有体现出元组的效率更高的特性。

    
    
  • mr.pa
    2019-09-29
    老师 我觉得用zodiac_day = list(x for x in zodiac_days if x<(mouth, day))代替
    zodiac_day = filter(lambda x: x <= (mouth, day), zodiac_days) 会更加容易理解
    
    
  • Geek_d8171d
    2019-08-17
    zodiac_name = (u'摩羯座',u'水瓶座',u'白羊座'u'金牛座'u'双子座',
                   u'巨蟹座',u'狮子座',u'处女座',u'天秤座',u'天蝎座',u'射手座')
    zodiac_days = ((1,28),(2,19),(3,21),(4,21),(5,21),(6,22),
                   (7,23),(8,23),(9,23),(10,23),(11,23),(12,23))


    (month,day) = (11,9)
    zodac_day = filter(lambda x: x<=(month,day), zodiac_days)
    # print(zodac_day)
    zodiac_len = len(list(zodac_day))%12
    print(zodiac_name[zodiac_len])
    运行结果:"C:\Program Files\Python37\python.exe" D:/python/zodiac.py
    Traceback (most recent call last):
      File "D:/python/zodiac.py", line 13, in <module>
        print(zodiac_name[zodiac_len])
    IndexError: tuple index out of range

    Process finished with exit code 1
    我尝试给month day输入别的数值的时候就出错,月份大于9就不行
    展开

    作者回复: n=0
    for i in zodiac_name:
        print("第" + str(n) + "个元素是" + i)
        n += 1

    
    
  • Chensmoker
    2019-07-14
    摩羯座是12.22号--1月19号,视频中错了吧
    
    
  • 彪哥的炉子
    2019-06-29
    老师好,下面这段代码运行时提示出错
    zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座', u'巨蟹座',
                   u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')
    zodiac_days = ((1, 20), (2, 19), (3, 21), (4, 21), (5, 21), (6, 22),
                   (7, 23), (8, 23), (9.23), (10.23), (11, 23), (12, 23))
    (month, day) = (2, 15)
    zodiac_day = filter(lambda x: x<=(month, day), zodiac_days)
    #print(zodiac_day)
    zodac_len = len(list(zodiac_day))
    print(zodiac_name[zodac_len])

    运行结果:
    /Users/chenlubiao/Desktop/Python/PyProjects/GeekTimePythonBasics/venv/bin/python /Users/chenlubiao/Desktop/Python/PyProjects/GeekTimePythonBasics/week_01.py
    Traceback (most recent call last):
      File "/Users/chenlubiao/Desktop/Python/PyProjects/GeekTimePythonBasics/week_01.py", line 10, in <module>
        zodac_len = len(list(zodiac_day))
      File "/Users/chenlubiao/Desktop/Python/PyProjects/GeekTimePythonBasics/week_01.py", line 8, in <lambda>
        zodiac_day = filter(lambda x: x<=(month, day), zodiac_days)
    TypeError: '<=' not supported between instances of 'float' and 'tuple'
    Process finished with exit code 1

    我把“len(list(zodiac_day))”这一句换成具体的整数就可以正常运行。麻烦帮忙看看,谢谢。
    展开

    作者回复: (9.23) 这里应该是 (9,23)

    
    
  • RLxiao
    2019-06-26
    老师您好,我的代码如下:
    # 按照月份和日期计算星座
    # 定义个元组用于表示星座 u表示指定字符串的编码为unicode
    zodica_name = (u'摩羯',u'水瓶',u'双鱼',u'白羊',u'金牛',u'双子',u'巨蟹',u'狮子',u'处女',u'天枰',u'天蝎',u'射手')

    # 定义一个元组 由于表示对用星座的起始日期
    zodiac_days = ((1,20),(2.19),(3,21),(4,21),(5,21),(6,22),(7,23),(8,23),(9,23),(10,23),(11,23),(12,23))

    # 定义要计算的月份 和 日期
    (month,day) = (2,15)

    # 元组之间的标间 可以看做是元组组成的数字之间的标间

    # 通过filter过滤器筛选符合条件的原则
    zodiac_day = filter(lambda x: x <= (month, day), zodiac_days)

    # 通过 list收集展示 并通过 len求出长度
    zodiac_len = len(list(zodiac_day)) % 12

    # 通过余数获取对应的星座
    print(zodica_name[zodiac_len])

    可是运行的时候确实错误的
    报错如下:TypeError: '<=' not supported between instances of 'float' and 'tuple'
    说元组不支持这杨的一个类型

    展开

    作者回复: 我说一下我解决这个问题的思路吧
    首先看到报错,我认为问题首先出现在 x <= (month, day) 这里,所以把程序做了简化
    zodiac_days = (
    (1, 20), (2.19), (3, 21), (4, 21), (5, 21), (6, 22), (7, 23), (8, 23), (9, 23), (10, 23), (11, 23), (12, 23))

    (month, day) = (2, 15)

    zodiac_day = filter(lambda x: x <= (month, day), zodiac_days)

    list(zodiac_day)

    依然报错,证明之前的猜测是正确的,那继续将程序精简成伪代码分析逻辑


    定义 zodiac_days = (
    (1, 20), (2.19), (3, 21), (4, 21), (5, 21), (6, 22), (7, 23), (8, 23), (9, 23), (10, 23), (11, 23), (12, 23))
    定义 (month, day) = (2, 15)
    逐个比较 zodiac_days <= (month, day)
    找到 一个是tuple 和 float 格式进行比较

    这样就很容易定位到 (2.19) 不是tuple类型, 是浮点类型

    所以问题是书写错误, 应该是(2,19) 不是 (2.19)

    
    
  • 一步一脚印
    2019-06-21
    lambda 不生效怎么解决呢? 返回的值为零。

    作者回复: 把具体的脚本贴出来看下

     1
    
  • 孙祥烈L
    2019-05-11
    请问为什么就只是改变了一下顺序,结果就不一样了
    1.
    zodiac_name = (u'摩羯座', u'水瓶座', u'双鱼座', u'白羊座', u'金牛座', u'双子座',
                u'巨蟹座', u'狮子座', u'处女座', u'天秤座', u'天蝎座', u'射手座')
    zodiac_days = ((1,20), (2,19), (3,21),(4,21), (5,21), (6,22),
                   (7,23), (8,23), (9,23), (10,23), (11,23), (12,23))

    (month, day) = (10,21)
    zodiac_day = filter(lambda x: x<=(month,day), zodiac_days)
    #print(zodiac_day)
    zodiac_len = len(list(zodiac_day)) % 12
    print(len(list(zodiac_day)) % 12)
    print(zodiac_name[zodiac_len])
    结果:
    0
    天秤座


    2.
    print(len(list(zodiac_day)) % 12)
    zodiac_len = len(list(zodiac_day)) % 12
    print(zodiac_name[zodiac_len])
    结果:
    9
    摩羯座
    展开

    作者回复: filter()取出来的并不是一个字符串,而是一个“迭代器”,取出一次之后里面的内容就消失了,后面视频会解释这里提前挖好的“坑”

    
    
我们在线,来聊聊吧