下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 10 | 元组的定义和常用操作
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

零基础学Python

共71讲 · 71课时·约540分钟
16024
免费
01 | Python语言的特点
免费
02 | Python的发展历史与版本
免费
03 | Python的安装
免费
04 | Python程序的书写规则
免费
05 | 基础数据类型
免费
06 | 变量的定义和常用操作
07 | 序列的概念
08 | 字符串的定义和使用
09 | 字符串的常用操作
10 | 元组的定义和常用操作
11 | 列表的定义和常用操作
12 | 条件语句
13 | for循环
14 | while循环
15 | for循环语句中的if嵌套
16 | while循环语句中的if嵌套
17 | 字典的定义和常用操作
18 | 列表推导式与字典推导式
19 | 文件的内建函数
20 | 文件的常用操作
21 | 异常的检测和处理
22 | 函数的定义和常用操作
23 | 函数的可变长参数
24 | 函数的变量作用域
25 | 函数的迭代器与生成器
26 | Lambda表达式
27 | Python内建函数
28 | 闭包的定义
29 | 闭包的使用
30 | 装饰器的定义
31 | 装饰器的使用
32 | 自定义上下文管理器
33 | 模块的定义
34 | PEP8编码规范
35 | 类与实例
36 | 如何增加类的属性和方法
37 | 类的继承
38 | 类的使用-自定义with语句
39 | 多线程编程的定义
40 | 经典的生产者和消费者问题
41 | Python标准库的定义
42 | 正则表达式库re
43 | 正则表达式的元字符
44 | 正则表达式分组功能实例
45 | 正则表达式库函数match与s...
46 | 正则表达式库替换函数sub...
47 | 日期与时间函数库
48 | 数学相关库
49 | 使用命令行对文件和文件夹...
50 | 文件与目录操作库
51 | 机器学习的一般流程与NumP...
52 | NumPy的数组与数据类型
53 | NumPy数组和标量的计算
54 | NumPy数组的索引和切片
55 | pandas安装与Series结构
56 | Series的基本操作
57 | Dataframe的基本操作
58 | 层次化索引
59 | Matplotlib的安装与绘图
60 | 机器学习分类的原理
61 | Tensorflow的安装
62 | 根据特征值分类的模型和代...
63 | 网页数据的采集与urllib库
64 | 网页常见的两种请求方式ge...
65 | HTTP头部信息的模拟
66 | requests库的基本使用
67 | 结合正则表达式爬取图片链...
68 | Beautiful Soup的安装和...
69 | 使用爬虫爬取新闻网站
70 | 使用爬虫爬取图片链接并下...
71 | 如何分析源代码并设计合理...

精选留言(37)

  • 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语言的%就是取模。

    26
  • 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异常,告诉用户已经没有可以取得内容了

    7
  • 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异常,告诉用户已经没有可以取得内容了

    3
  • 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()查看和输出一下,带,和不带,的区别

    3
  • _
    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
  • 2018-08-23
    你好,请教个问题,为什么相同的代码,我的结果出来的是摩羯座,看了下list结果是(1,20),len的结果是0

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

    1
  • 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
  • 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
  • 2019-11-05
    老师,我有个问题,为什么星座的输入月份和日期要用元组的嵌套?
    还有个问题,用元组嵌套这种方式,好像并没有包含每个月的所有日期?

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

  • 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) 会更加容易理解
  • 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

  • 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)

  • 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
  • 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()取出来的并不是一个字符串,而是一个“迭代器”,取出一次之后里面的内容就消失了,后面视频会解释这里提前挖好的“坑”

  • 2019-04-16
    #作業 元組的基本操作
    #定义一个新的元组,和 1. 的元组连接成一个新的元组
    men01 = (u'陳之漢',u'彭于晏', u'李笑來', u'吳軍', u'村上春樹', u'駱以軍')
    list_men01 = list(men01)
    men02 = (u'和菜頭', u'杜少斐', u'班艾佛列克')
    list_men02 = list(men02)
    list_men03 = list_men01 + list_men02
    men03 = tuple(list_men03)
    print (men03)
    展开
  • 2019-04-12
    tup = (1, 2, ['a', 'b', 'c'], 'd', 'e', ('gu', 'tang'))
    tup.append(3)

    tup = (1, 2, ['a', 'b', 'c'], 'd', 'e', ('gu', 'tang'))
    print (tup[-2])

    tup = (1, 2, ['a', 'b', 'c'], 'd', 'e', ('gu', 'tang'))
    tup2 = (3,5,6,['x','y','z'],'hh')
    print (tup + tup2)

    tup = (1, 2, ['a', 'b', 'c'], 'd', 'e', ('gu', 'tang'))
    print (len(tup))
    展开
  • 2019-03-24
    在声明星座元组的时候,每个元素前面的u的作用是什么?

    作者回复: u表示采用unicode方式存储字符串,在python3中已统一使用unicode,因此中文字符串前是否增加无影响

  • 2019-03-22
    为什么我打印出来是摩羯座
    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))

    a = (2, 15)
    zodiac_day = filter(lambda x: x <= a, zodiac_days)
    print(list(zodiac_day))

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

    作者回复: 如果将第4、5行的
    zodiac_day = filter(lambda x: x <= a, zodiac_days)
    print(list(zodiac_day))

    改为
    4 zodiac_day = filter(lambda x: x <= a, zodiac_days)
    5 print(list(zodiac_day))
    6 print(list(zodiac_day))

    你会发现5、6行输出的是
    [(1, 20)]
    []
    因为filter函数返回的是一种叫做迭代器的类型,当你使用list()取出一次结果之后,zodiac_day 里面就空了,所以让程序正确显示的方法是注释掉第五行的
    # print(list(zodiac_day))
    迭代器后面章节会讲到