零基础学 Python(2018 版)
尹会生
前游戏公司技术总监,前新浪网技术经理
80141 人已学习
新⼈⾸单¥68
课程目录
已完结/共 72 讲
第一章 :Python介绍和安装 (3讲)
第二章 :Python基础语法 (3讲)
第四章 :条件与循环 (5讲)
第五章 :映射与字典 (2讲)
第六章 :文件和输入输出 (2讲)
第七章 :错误和异常 (1讲)
第九章 :模块 (1讲)
第十章 :语法规范 (1讲)
第十一章 :面向对象编程 (4讲)
第十二章 :多线程编程 (2讲)
第十六章 :综合案例 & 结课测试 (1讲)
特别放送 (1讲)
零基础学 Python(2018 版)
登录|注册
留言
58
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 10 | 元组的定义和常用操作
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
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与search的区别
46 | 正则表达式库替换函数sub()的实例
47 | 日期与时间函数库
48 | 数学相关库
49 | 使用命令行对文件和文件夹操作
50 | 文件与目录操作库
51 | 机器学习的一般流程与NumPy安装
52 | NumPy的数组与数据类型
53 | NumPy数组和标量的计算
54 | NumPy数组的索引和切片
55 | pandas安装与Series结构
56 | Series的基本操作
57 | Dataframe的基本操作
58 | 层次化索引
59 | Matplotlib的安装与绘图
60 | 机器学习分类的原理
61 | Tensorflow的安装
62 | 根据特征值分类的模型和代码
63 | 网页数据的采集与urllib库
64 | 网页常见的两种请求方式get和post
65 | HTTP头部信息的模拟
66 | requests库的基本使用
67 | 结合正则表达式爬取图片链接
68 | Beautiful Soup的安装和使用
69 | 使用爬虫爬取新闻网站
70 | 使用爬虫爬取图片链接并下载图片
强势回归:零基础学Python2022版来啦!
71 | 如何分析源代码并设计合理的代码结构&结课测试
本节摘要
登录 后留言

全部留言(58)

  • 最新
  • 精选
风萧萧
请问下,发现 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语言的%就是取模。

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

2018-06-07
2
18
iam.wang
#练习四,元组基本操作 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()查看和输出一下,带,和不带,的区别

2018-06-10
3
11
返回摩羯座的那个,如果使用演示代码(如下): 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异常,告诉用户已经没有可以取得内容了

2018-06-10
5
RLxiao
老师您好,我的代码如下: # 按照月份和日期计算星座 # 定义个元组用于表示星座 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-26
4
_
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()操作之后,里面就是空值,所以每次得到的结果不同

2019-06-27
3
Megahertz
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会发现它的类型是一个迭代类型,当你去取迭代类型的数据时,相当于把里面的内容拿走了,它存储的内容为空,自然统计长度变成第一个,即你看到结果。

2018-08-08
2
历史课代表
zodiac_len = len(list(zodiac_day)),在这句代码之前加上一句打印语句:print(list(zodiac_day));然后zodiac_len的值就一直是0,这是为什么?

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

2020-01-21
1
A.I.
奇怪,我把日期改为(1,20),为什么出来的结果是水瓶座,不应该是摩羯座的吗? 以下是我的代码 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)=(1,20) zodiac_day=filter(lambda x:x<=(month,day),zodiac_days) zodiac_len=len(list(zodiac_day))%12 print(zodiac_name[zodiac_len])

作者回复: x<=(month,day) 得到 list(zodiac_day) 是 [(1, 20)] ,后面len(list(zodiac_day)) 计算的结果 1 ,所以 得到最终的结果就是 print(zodiac_name[1]) == 水瓶座了

2019-03-18
2
1
lfwei
(month, day) = (4, 15) zodiac_day = filter(lambda x: x <= (month, day), zodiac_days) # print(list(zodiac_day)) zodiac_len = len(list(zodiac_day)) print(zodiac_len) zodiac_len打印出的结果是 3 (month, day) = (4, 15) zodiac_day = filter(lambda x: x <= (month, day), zodiac_days) print(list(zodiac_day)) zodiac_len = len(list(zodiac_day)) print(zodiac_len) zodiac_len打印出的结果是 0 为什么zodiac_len发生了变化,打印结果不一样?

作者回复: 结果不同是因为这里使用了一个filter()函数,它比较特殊,它的返回类型叫迭代器,是我们后面要讲的一种函数功能。 filter函数返回的内容类似一根长长的管子,里面按顺序依次存好要输出的元素,使用list()函数可以一次性将管子里的数据都取出来,第二次再去取管子中自然是空的了。所以第二次执行时返回结果为0

2018-09-05
1
收起评论