习题等资源来源于网络,本人只是在此收集整理,如有版权问题,归小甲鱼所属。小甲鱼:https://ilovefishc.com/
1、Python 是什么类型的语言?
Python 是脚本语言
脚本语言 (Scripting language) 是电脑编程语言,因此也能让开发者藉以编写出
让电脑听命行事的程序。 以简单的方式快速完成某些复杂的事情通常是创造脚本
语言的重要原则,基于这项原则,使得脚本语言通常比 C 语言、 C++ 语言 或
Java 之类的系统编程语言要简单容易。
也让脚本语言另有一些属于脚本语言的特性:
语法和结构通常比较简单
学习和使用通常比较简单
通常以容易修改程序的“解释”作为运行方式,而不需要“编译”
程序的开发产能优于运行性能
2、IDLE 是什么?
IDLE 是一个 Python Shell ,shell 的意思就是“外壳”,基本上来说,就是一个通过键入文本与程序交互的途径! 像我们 Windows 那个 cmd 窗口,像Linux 那个黑乎乎的命令窗口,他们都是 shell ,利用他们,我们就可以给操作系统下达命令。同样的,我们可以利用 IDLE 这个 shell 与 Python 进行互动。
3、print() 的作用是什么?
print() 会在输出窗口中显示一些文本 (在这一讲中,输出窗口就是 IDLE shell窗口)。
4、Python 中表示乘法的符号是什么?
Python 中的乘号是 *(星号)。
5、为什么 >>>print('I love fishc.com ’ * 5) 可以正常执行,但 >>>print('I love fishc.com ’ + 5) 却报错?
在 Python 中不能把两个完全不同的东西加在一起,比如说数字和文本,正是这个原因,>>>print('I love fishc.com ' + 5) 才会报错。
这就像是在说“五只小甲鱼加上苍井空会是多少?”一样没有多大意义, 结果可能是五,可能是六,也可能是八!不过乘以一个整数来翻倍就具有一定的意义了, 前边的例子就是将
"I love fishc.com" 这个字符串打印五次。
6、如果我需要在一个字符串中嵌入一个双引号,正确的做法是?
你有两个选择:可以利用反斜杠( )对双引号转义: \" ,或者用单引号引起这个字符串。例如: ' I l"o"ve fishc.com ' 。
7、为什么我们要使用 Python3 ?Python2 到底有什么问题?看起来很多程序
员依然都在使用 Python2 ?
确实还有相当多的程序员在使用 Python2 ,不过 Python3 才是 Python 发展的未来,就像 XP 和 WIN7 一样
1、什么是 BIF?
BIF 就是 Built-in Functions ,内置函数。为了方便程序员快速编写脚本程序 (脚本就是要编程速度快快快!!!), Python 提供了非常丰富的内置函数,我们只需要直接调用即可,
例如 print() 的功能是“打印到屏幕”,
input() 的作用是接收用户输入
(注:Python3 用 input() 取代了 Python2 的 raw_input())。
2、 用课堂上小甲鱼教的方法数一数 Python3 提供了多少个 BIF?
在 Python 或 IDLE 中,输入 dir(__builtins__) 可以看到 Python 提供的内置方法列表(注意, builtins 前后是两个下划线哦)其中小写的就是 BIF。
如果想具体查看某个 BIF 的功能,比如 input() ,可以在 shell 中输入 help(input) ,就会得到这个 BIF 的功能描述。
3、在 Python 看来: ‘FishC’ 和 ‘fishc’ 一样吗?
不一样,因为 Python 是一个“敏感的小女孩”,所以不要试图欺骗她,对Python 来说, fishc 和 FishC 是完全不同的两个名字,所以编程的时候一定要当心。不过 Python 会帮助解决可能因此出现的问题,例如只有当标识符已经赋值后(还记得吗,小甲鱼在课堂中说过 Python 的变量是不用先声明的)才能在代码中使用, 未赋值的标识符直接使用会导致运行时错误, 所以你很快就可以根据经验发现此问题。
4、Python 中什么是最重要的?你赞同吗?
缩进!在小甲鱼看来,缩进是 Python 的灵魂,缩进的严格要求使得 Python 的
代码显得非常精简并且有层次(小甲鱼阅读过很多大牛的代码,那个乱 ......C语
言不是有国际乱码大赛嘛 ......)。
所以在 Python 里对待缩进代码要十分小心,如果没有正确地缩进,代码所做
的事情可能和你的期望相去甚远(就像 C 语言里边括号打错了位置)。
如果在正确的位置输入冒号“ : ”, IDLE 会自动将下一行缩进!
5、 这节课的例子中出现了“ =”和“ ==”,他们表示不同的含义,你在编程的过程中会不小心把“ ==”误写成“ =”吗?有没有好的办法可以解决这个问题呢?
C 语言的话,如果 if( c == 1 ) 写成 if( c = 1 ) ,程序就完全不按程序员原本的
目的去执行,但在 Python 这里,不好意思,行不通,语法错误! Python 不
允许 if 条件中赋值,所以 if c = 1: 会报错!
6、你听说过“拼接”这个词吗?
在一些编程语言,我们可以将两个字符串“相加”在一起,如: 'I' + 'Love' + 'FishC' 会得到 'ILoveFishC' ,在 Python 里,这种做法叫做拼接字符串。
1、编写程序: hello.py ,要求用户输入姓名并打印“你好,姓名!”
name=input("请输入姓名:")
print("hello"+name+"!")
2、编写程序: calc.py 要求用户输入 1 到 100 之间数字并判断,输入符合要求打印“你妹好漂亮”,不符合要求则打印“你大爷好丑”
num=input("请输入0-100之间的数字")
if 1<=num<=100:
print("你没好漂亮")
else:
print("你大爷好丑")
3、如果非要在原始字符串结尾输入反斜杠,可以如何灵活处理?
>>>str = r'C:\Program Files\FishC\Good''\\'
测试题:
1、请问以下代码会打印多少次“我爱鱼 C!”
while 'C':
print(' 我爱鱼 C!')
无数次
造成死循环的原因是 while 后边的条件永远为真 (True) ,在 Python 看来,只有以下内容
会被看作假(注意冒号括号里边啥都没有,连空格都不要有!):
False None 0 "" '' () [] {}
其他一切都被解释为真!
2、请问以下代码会打印多少次“我爱鱼 C!”
i = 10
while i:
print(' 我爱鱼 C!')
i = i - 1
10
3、请写出与 10 < cost < 50 等价的表达式
cost>=50 and cost<=10
4、Python3 中,一个语句可以分成多行书写吗?
可以,语句用;隔开
print('I love fishc');print('very much!')
5、请问 Python 的 and 操作符 和 C 语言的 && 操作符 有何不同?【该题针对有 C 或
C++ 基础的朋友】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h3OoWuxq-1592991150349)(C:\Users\19674\AppData\Roaming\Typora\typora-user-images\image-20200605213143634.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ec4dF78Y-1592991150356)(C:\Users\19674\AppData\Roaming\Typora\typora-user-images\image-20200605213154891.png)]
6、听说过“短路逻辑( short-circuit logic )”吗?
逻辑操作符有个有趣的特性:在不需要求值的时候不进行操作。这么说可能比较“高深”,
举个例子,表达式 x and y ,需要 x 和 y 两个变量同时为真 (True) 的时候,结果才为真。
因此,如果当 x 变量得知是假 (False) 的时候,表达式就会立刻返回 False ,而不用去管 y 变量的值。
实际上, Python 的做法是如果 x 为假,表达式会返回 x 的值 (0) ,否则它就会返回 y 的值(例子参考楼上那题)。
动动手:
1、完善第二个改进要求(为用户提供三次机会尝试,机会用完或者用户猜中答案均退出循
环)并改进视频中小甲鱼的代码。
import random
secret = random.randint(1, 10)
temp = input("猜猜我想那个数字?")
guess = int(temp)
time = 3
while guess != secret and time > 0:
time = time-1
temp = input("猜错了,重新输入吧")
guess = int(temp)
if guess == secret:
print("猜对了,棒棒?!")
else:
if guess > secret:
print("猜大了,你个傻蛋")
else:
print("猜小了")
print("game over!!!")
模板答案
1. import random
2. times = 3
3. secret = random.randint(1,10)
4. print('------------------ 我爱鱼 C 工作室 ------------------')
5. # 这里先给 guess 赋值(赋一个绝对不等于 secret 的值)
6. guess = 0
7. # print() 默认是打印完字符串会自动添加一个换行符, end=" " 参数告诉 print() 用空格代替
换行
8. # 嗯,小甲鱼觉得富有创意的你应该会尝试用 end="JJ" ?
9. print(" 不妨猜一下小甲鱼现在心里想的是哪个数字: ", end=" ")
10. while (guess != secret) and (times > 0):
11. temp = input()
12. guess = int(temp)
13. times = times - 1 # 用户每输入一次,可用机会就 -1
14. if guess == secret:
15. print(" 我草,你是小甲鱼心里的蛔虫吗?! ")
16. print(" 哼,猜中了也没有奖励! ")
17. else:
18. if guess > secret:
19. print(" 哥,大了大了 ~~~")
20. else:
21. print(" 嘿,小了,小了 ~~~")
22. if times > 0:
23. print(" 再试一次吧: ", end=" ")
24. else:
25. print(" 机会用光咯 T_T")
26. print(" 游戏结束,不玩啦 ^_^")
2、尝试写代码实现以下截图功能:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oTu1I7HR-1592991150361)(C:\Users\19674\AppData\Roaming\Typora\typora-user-images\image-20200605212751556.png)]
temp = input("请输入一个数字:")
num = int(temp)
i = 1
while i < num+1:
print(i)
i = i+1
模板代码
1. temp = input(' 请输入一个整数 :')
2. number = int(temp)
3. i = 1
4. while number:
5. print(i)
6. i = i + 1
7. number = number - 1
3、尝试写代码实现以下截图功能:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rq7uj0b2-1592991150365)(C:\Users\19674\AppData\Roaming\Typora\typora-user-images\image-20200605212811897.png)]
temp = input("请输入一个整数:")
num = int(temp)
while num:
i = num - 1
while i:
print(' ', end='')
i = i - 1
j = num
while j:
print('*', end='')
j = j - 1
print()
num = num-1
测试题:
1、 在 Python 中,int 表示整型,那你还记得 bool 、float 和 str 分别表示什么吗?
布尔,浮点,字符串
2、你知道为什么布尔类型 (bool) 的 True 和 False 分别用 1 和 0 来代替吗?
你可能听说过计算机是很“笨”的, 究其根本是因为它只认识二进制数, 所以所
有的编程语言最终都会转换成简单的二进制序列给 CPU 按照一定的规则解析。
由于二进制只有两个数: 0 和 1,因此用 0 和 1 来表示 False 和 True 再适
合不过了,因为不用浪费资源在转换的过程上!
3、使用 int() 将小数转换为整数,结果是向上取整还是向下取整呢?
向下取整
4、我们人类思维是习惯于“四舍五入”法,你有什么办法使得 int() 按照“四舍五入”的方式取整吗?
+0.5
5、取得一个变量的类型, 视频中介绍可以使用 type() 和 isinstance() ,你更倾向于使用哪个?
建议使用 isinstance() ,因为它的返回结果比较直接,另外 type() 其实并没有你想象的那么简单,我们后边会讲到。
6、Python3 可以给变量命名中文名,知道为什么吗?
Pyhton3 源码文件默认使用 utf-8 编码(支持中文),这就使得以下代码是合法的:
>>> 小甲鱼 = ' 我爱你 '
>>> print( 小甲鱼 )
>>> 我爱你
动动手:
1、针对视频中小甲鱼提到的小漏洞,再次改进我们的小游戏:当用户输入错误类型的时候,及时提醒用户重新输入,防止程序崩溃。
如果你尝试过以下做法,请举下小手:
1. temp = input(" 不妨猜一下小甲鱼现在心里想的是哪个数字: ")
2. # 这种想法是因为 type(1) 会返回 ,如果 type(temp) 返回结果一致说明输入
是整数。
3. while type(temp) != type(1):
4. print(" 抱歉,输入不合法, ", end='')
5. temp = input(" 请输入一个整数: ")
或者可能这样:
1. temp = input(" 不妨猜一下小甲鱼现在心里想的是哪个数字: ")
2. # not 操作符的作用是将布尔类型的结果翻转:即取反的意思, not True == Flase
3. while not isinstance(temp, int):
4. print(" 抱歉,输入不合法, ", end='')
5. temp = input(" 请输入一个整数: ")
以上方法的思路是正确的,不过似乎忽略了一点儿:就是 input() 的返回值始终是字符串,所以 type(temp) 永远是
其实有蛮多的做法可以实现的,不过就目前我们学习过的内容来看,还不足够。
所以,在让大家动手完成这道题之前,小甲鱼介绍一点新东西给大家!
s 为字符串
s.isalnum() 所有字符都是数字或者字母,为真返回 Ture,否则返回 False。
s.isalpha() 所有字符都是字母,为真返回 Ture ,否则返回 False。
s.isdigit() 所有字符都是数字,为真返回 Ture ,否则返回 False。
s.islower() 所有字符都是小写,为真返回 Ture ,否则返回 False。
s.isupper() 所有字符都是大写,为真返回 Ture ,否则返回 False。
s.istitle() 所有单词都是首字母大写,为真返回 Ture ,否则返回 False。
s.isspace() 所有字符都是空白字符,为真返回 Ture ,否则返回 False。
例如:
>>> s = 'I LOVE FISHC'
>>> s.isupper()
>>> True
好了,文字教程就到这里,大家赶紧趁热打铁,改造我们的小游戏吧!
import random
time = 3
secret = random.randint(1, 10)
print("猜猜我想那个数字?")
guess = 0
while guess != secret and time > 0:
temp = input()
while not temp.isdigit():
temp = input("输入有误,请输入数字")
guess = int(temp)
time = time - 1
if guess == secret:
print("猜对了,棒棒?!")
else:
if guess > secret:
print("猜大了,你个傻蛋", end="")
else:
print("猜小了", end="")
if time > 0:
print("try again")
else:
print("没机会了")
print("game over!!!")
2、写一个程序,判断给定年份是否为闰年。 (注意:请使用已学过的 BIF 进行灵活运用)
这样定义闰年的 :能被 4 整除但不能被 100 整除,或者能被 400 整除都是闰年。
1. temp = input(' 请输入一个年份: ')
2. while not temp.isdigit():
3. temp = input(" 抱歉,您的输入有误,请输入一个整数: ")
4.
5. year = int(temp)
6. if year/400 == int(year/400):
7. print(temp + ' 是闰年! ')
8. else:
9. if (year/4 == int(year/4)) and (year/100 != int(year/100)):
10. print(temp + ' 是闰年! ')
11. else:
12. print(temp + ' 不是闰年! ')
测试题:
1、Python 的 floor 除法现在使用 “ // ” 实现,那 3.0 // 2.0 您目测会显示
什么内容呢?
如果回答是 1.5 那么很遗憾, 您受到 C 语言的影响比较大, Python 这里会义无反顾地执行 floor 除法原则,答案是: 1.0
2、a < b < c 事实上是等于?
a
3、不使用 IDLE,你可以轻松说出 5 ** -2 的值吗?
1/25 幂运算操作符比其左侧的一元操作符优先级高,比其右侧的一元操作符优先级低。
4、如何简单判断一个数是奇数还是偶数?
使用求余可以简单得到答案:能被 2 整除为偶数,所以 x % 2 == 0 ,否则为奇数。
5、请用最快速度说出答案:
not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and
8 and 9
如果你的回答是 0,那么小甲鱼很开心你中招了!
答案是: 4
not or and 的优先级是不同的: not > and > or
我们按照优先级给它们加上括号: (not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)
== 0 or 0 or 4 or 6 or 9
== 4
为啥是 4?
大家还记得第四讲作业提到的“短路逻辑”吗? 3 and 4 == 4 ,而 3 or 4 == 3。
所以答案是: 4
温馨提示:为了更好的表达你的程序, 小甲鱼再次呼吁有些括号还是不能省下的,毕竟不是所有程序员都跟你一样都将优先级烂透于心的。
6、还记得我们上节课那个求闰年的作业吗?如果还没有学到“求余”操作,还
记得用什么方法可以“委曲求全”代替“ %”的功能呢?
因为上节课我们还没有教大家“求余”的操作, 所以小甲鱼使用了“ if year/400 == int(year/400) ”这样的方式来“委曲求全”。
动动手:
1、请写一个程序打印出 0~100 所有的奇数。
i = 100
while i:
if i % 2 == 0:
pass
else:
print(i)
i -= 1
2、我们说过现在的 Python 可以计算很大很大的数据,但是 …真正的大数据计算可是要靠刚刚的硬件滴,不妨写一个小代码,让你的计算机为之崩溃?
print(2 ** 2 ** 32)
3、爱因斯坦曾出过这样一道有趣的数学题: 有一个长阶梯, 若每步上 2 阶,最后剩1 阶;若每步上 3 阶,最后剩 2 阶;若每步上 5 阶,最后剩 4 阶;若每步上 6阶,最后剩 5 阶;只有每步上 7 阶,最后刚好一阶也不剩。
(小甲鱼温馨提示:步子太大真的容易扯着蛋 ~~~ )
题目:请编程求解该阶梯至少有多少阶?
answer = 0
while 1:
if (answer % 2 == 1) and (answer % 3 == 2) and (answer % 5 == 4) and (answer % 6 == 5) and (answer % 7 == 0):
print(answer)
break
else:
answer = answer+1
答案
1. x = 7
2. i = 1
3. flag = 0
4.
5. while i <= 100:
6. if (x%2 == 1) and (x%3 == 2) and (x%5 == 4) and (x%6==5):
7. flag = 1
8. else:
9. x = 7 * (i+1) # 根据题意, x 一定是 7 的整数倍,所以每次乘以 7
10. i += 1
11.
12. if flag == 1:
13. print(' 阶梯数是: ', x)
14. else:
15. print(' 在程序限定的范围内找不到答案! ')
第七课是第六课答案
1、if not (money < 100): 上边这行代码相当于?
if (money>=100)
2、assert 的作用是什么?
assert 这个关键字我们称之为“断言”,当这个关键字后边的条件为假的时候,
程序自动崩溃并抛出 AssertionError 的异常。
什么情况下我们会需要这样的代码呢?当我们在测试程序的时候就很好用, 因为
与其让错误的条件导致程序今后莫名其妙地崩溃, 不如在错误条件出现的那一瞬
间我们实现“自爆”。
一般来说我们可以用 Ta 再程序中置入检查点,当需要确保程序中的某个条件一
定为真才能让程序正常工作的话, assert 关键字就非常有用了。
3、假设有 x = 1 ,y = 2 ,z = 3 ,请问如何快速将三个变量的值互相交换?
x, y, z = z, y, x
4、猜猜 (x < y and [x] or [y])[0] 实现什么样的功能?
这其实是 Python 的作者还没有为 Python 加入三元操作符之前, Python 社
区的小伙伴们灵活的使用 and 和 or 搭配来实现三元操作符的功能, 这里边有涉及到列表和切片的知识, 这部分知识很快就会讲解, 迫不及待的朋友可以先稍微预习下。
5、你听说过成员资格运算符吗?
Python 有一个成员资格运算符: in,用于检查一个值是否在序列中,如果在序
列中返回 True ,否则返回 False。
例如:
1. >>> name = ' 小甲鱼 '
2. >>> ' 鱼' in name
3. True
4. >>> ' 肥鱼 ' in name
5. False
当下节课我们讲解 for 语句的时候, 你看到 in 会不会就有了更深入的理解?!
动动手:
1、视频中小甲鱼使用 if elif else 在大多数情况下效率要比全部使用 if 要高,但根据一般的统计规律, 一个班的成绩一般服从正态分布, 也就是说平均成绩一般集中在 70~80 分之间,因此根据统计规律,我们还可以改进下程序以提高效率。
题目备忘:按照 100 分制,90 分以上成绩为 A,80 到 90 为 B,60 到 80 为 C,60 以下为 D,写一个程序,当用户输入分数,自动转换为 ABCD 的形式打印。
1. score = int(input(' 请输入一个分数: '))
2. if 80 > score >= 60:
3. print('C')
4. elif 90 > score >= 80:
5. print('B')
6. elif 60 > score >= 0:
7. print('D')
8. elif 100 >= score >= 90:
9. print('A')
10. else:
11. print(' 输入错误! ')
2、Python 的作者在很长一段时间不肯加入三元操作符就是怕跟 C 语言一样搞出国际乱码大赛, 蛋疼的复杂度让初学者望而生畏, 不过,如果你一旦搞清楚了三元操作符的使用技巧,或许一些比较复杂的问题反而迎刃而解。请将以下代码修改为三元操作符实现:
1. x, y, z = 6, 5, 4
2. if x < y:
3. small = x
4. if z < small:
5. small = z
6. elif y < z:
7. small = y
8. else:
9. small = z
small = x if (x < y and x < z) else (y if y < z else z)
1、下面的循环会打印多少次 “I Love FishC” ?
1. for i in range(0, 10, 2):
2. print('I Love FishC')
5次,因为从 0 开始,到 10 结束,步进为 2。
2、下面的循环会打印多少次 “I Love FishC” ?
1. for i in 5:
2. print('I Love FishC')
会报错,上节课的课后习题我们提到了 in 是“成员资格运算符”, 而不是像 C
语言那样去使用 for 语法。Python 的 for 更像脚本语言的 foreach 。
3、回顾一下 break 和 continue 在循环中起到的作用?
break 语句的作用是终止当前循环,跳出循环体。
continue 语句的作用是终止本轮循环并开始下一轮循环(这里要注意的是:在
开始下一轮循环之前,会先测试循环条件)。
4、 什么情况下我们要使循环永远为真?
while Ture:
循环体
同样用于游戏实现, 因为游戏只要运行着, 就需要时刻接收用户输入, 因此使用永远为真确保游戏“在线”。 操作系统也是同样的道理, 时刻待命,操作系统永
远为真的这个循环叫做消息循环。另外,许多通讯服务器的客户端 /服务器系统
也是通过这样的原理来工作的。
所以永远为“真”虽然是“死循环”, 但不一定是坏事, 再说了,我们可以随时
用 break 来跳出循环!
5、请问 range(10) 生成哪些数?
会生成 range(0, 10) ,list(range(0, 10)) 转换成列表是: [0, 1, 2, 3, 4, 5, 6, 7, 8,
9],注意不包含 10 哦。
6、目测以下程序会打印什么?
1. while True:
2. while True:
3. break
4. print(1)
5. print(2)
6. break
7. print(3)
2
3
7、【学会提高代码的效率】你的觉得以下代码效率方面怎样?有没有办法可以大幅度改进 (仍然使用 while) ?
1. i = 0
2. string = 'ILoveFishC.com'
3. while i < len(string)):
4. print(i)
5. i += 1
1. i = 0
2. string = 'ILoveFishC.com'
lenstring=len(string)
3. while i < len(string)):
4. print(i)
5. i += 1
动动手:
1、设计一个验证用户密码程序,用户只有三次机会输入错误,不过如果用户输入的内容中包含 “*” 则不计算在内。
count = 3
password = 'FishC.com'
while count:
passwd = input('请输入密码:')
if passwd == password:
print('密码正确,进入程序......')
break
elif '*' in passwd:
print('密码中不能含有"*"号!您还有', count, '次机会!', end=' ')
continue
else:
print('密码输入错误!您还有', count-1, '次机会!', end=' ')
count -= 1
2、编写一个程序,求 100~999 之间的所有水仙花数。
如果一个 3 位数等于其各位数字的立方和, 则称这个数为水仙花数。 例如:153 = 1^3 + 5^3 + 3^3 ,因此 153 就是一个水仙花数。
for i in range(100, 1000):
first = i % 10
third = i // 100
second = i//10-third*10
num = first + second * 10 + third * 100
flower = first**3+second**3+third**3
if num == flower:
print(num, "是水仙花数")
1. for i in range(100, 1000):
2. sum = 0
3. temp = i
4. while temp:
5. sum = sum + (temp%10) ** 3
6. temp //= 10 # 注意这里要使用地板除哦 ~
7. if sum == i:
8. print(i)
3、三色球问题
有红、黄、蓝三种颜色的求,其中红球 3 个,黄球 3 个,绿球 6 个。先将这
12 个球混合放在一个盒子中,从中任意摸出 8 个球,编程计算摸出球的各种
颜色搭配。
print('red\tyellow\tblue')
for red in range(0, 4):
for yellow in range(0, 4):
for green in range(2, 7):
if red + yellow + green == 8:
# 注意,下边不是字符串拼接,因此不用“ +”哦 ~
print(red, '\t', yellow, '\t', green)
# range(2, 7) 是产生 [2, 3, 4, 5, 6]5 个数,绿球不能是 1 个,因为如果绿球是 1 个的话,红球 + 黄球需要有 7 个才能符合题意,而红球和黄球每种只有 3个,因此是 range(2, 7)
1、列表都可以存放一些什么东西?
我们说 Python 的列表是一个打了激素的数组,如果把数组比喻成集装箱,那
么 Python 的列表就是一个大仓库, Ta 可以存放我们已经学习过的任何数据类
型
>>> mix = [1, ‘小甲鱼’ , 3.14, [1, 2, 3]]
2、向列表增加元素有哪些方法?
这节课我们教过大家三种方法想列表增加元素, 分别是:append() 、extend() 和insert() 。
3、append() 方法和 extend() 方法都是向列表的末尾增加元素, 请问他们有什么区别?
append() 方法是将参数作为一个元素增加到列表的末尾。
extend() 方法则是将参数作为一个列表去扩展列表的末尾。
4、member.append([’ 竹林小溪 ‘, ‘Crazy 迷恋’]) 和 member.extend([’ 竹林小溪’, ‘Crazy 迷恋’]) 实现的效果一样吗?
不一样,因为怕大家没有仔细看上一题的示例,所以不懂的请看上一题解释。
1. >>> name = ['F', 'i', 's', 'h']
2. >>> name.append('C')
3. >>> name
4. ['F', 'i', 's', 'h', 'C']
5. >>> name.extend(['.', 'c'])
6. >>> name
7. ['F', 'i', 's', 'h', 'C', '.', 'c']
8. >>> name.append(['o', 'm'])
9. >>> name
10. ['F', 'i', 's', 'h', 'C', '.', 'c', ['o', 'm']]
5、有列表 name = [‘F’, ‘i’, ‘h’, ‘C’] ,如果小甲鱼想要在元素 ‘i’ 和 ‘h’ 之间插
入元素 ‘s’,应该使用什么方法来插入?
动动手:
name.insert(2, 's')
1、自己动手试试看,并分析在这种情况下,向列表添加数据应当采用哪种方法比较好?
假设给定以下列表:
member = [’ 小甲鱼 ‘, ‘黑夜’, ‘迷途’, ‘怡静’, ‘秋舞斜阳 ‘]
要求将列表修改为:
member = [’ 小甲鱼 ‘, 88, ’ 黑夜’, 90, ’ 迷途’, 85, ’ 怡静’, 90, ’ 秋舞斜阳 ', 88]
方法一:使用 insert() 和 append() 方法修改列表。
方法二:重新创建一个同名字的列表覆盖。
方法一:
1. member.insert(1, 88)
2. member.insert(3, 90)
3. member.insert(5, 85)
4. member.insert(7, 90)
5. member.append(88)
复制代码
方法二:
1. member = [' 小甲鱼 ', 88, ' 黑夜 ', 90, ' 迷途 ', 85, ' 怡静 ', 90, ' 秋舞斜阳 ', 88]
复制代码
对于这种情况,明显是第二种方法看起来要好一些嘛。
不过对于大型的列表, 第一种方法可能更合适, 所以我们说永远没有最好的, 只
有最合适的。
1、利用 for 循环打印上边 member 列表中的每个内容,如图:
1. member = [' 小甲鱼 ', 88, ' 黑夜 ', 90, ' 迷途 ', 85, ' 怡静 ', 90, ' 秋舞斜阳 ', 88]
2. for each in member:
3. print(each)
2、上一题打印的样式不是很好, 能不能修改一下代码打印成下图的样式呢? 【请至少使用两种方法实现】
1. 方法一:
2. count = 0
3. length = len(member)
4. while count < length:
5. print(member[count], member[count+1])
6. count += 2
7.
8. 方法二:
9.
10. for each in range(len(member)):
11. if each%2 == 0:
12. print(member[each], member[each+1])
5、注意,这道题跟上节课的那道题有点儿不同,回答完请上机实验或参考答案。
1. >>> old = [1, 2, 3, 4, 5]
2. >>> new = old
3. >>> old = [6]
4. >>> print(new)
如果不上机操作,你觉得会打印什么内容?
【6】
就是十二课的答案
1、 请问如何将下边这个列表的 '小甲鱼 '修改为 '小鱿鱼 '?
list1 = [1, [1, 2, [' 小甲鱼 ']], 3, 5, 8, 13, 18]
list1[1][2][0]='小鱿鱼'
2、要对一个列表进行顺序排序,请问使用什么方法?
列表名 .sort()
3、要对一个列表进行逆序排序,请问使用什么方法?
1. >>> 列表名 .sort()
2. >>> 列表名 .reverse()
或者
1. >>> 列表名 .sort(reverse=True)
4、列表还有两个内置方法没给大家介绍,不过聪明的你应该可以自己摸索使用的门道吧: copy() 和 clear()
copy() 方法跟使用切片拷贝是一样的:
1. >>> list2 = list1.copy()
2. >>> list2
3. [1, [1, 2, [' 小甲鱼 ']], 3, 5, 8, 13, 18]
clear() 方法用于清空列表的元素,但要注意,清空完后列表仍然还在哦,只是
变成一个空列表。
1. >>> list2.clear() 2. >>> list2 3. []
5、你有听说过列表推导式或列表解析吗?
没听过?!没关系,我们现场来学习一下吧,看表达式:
[ i*i for i in range(10) ]
你觉得会打印什么内容?
1. >>> [i**i for i in range(10)]
2. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
居然分别打印了 0 到 9 各个数的平方,然后还放在列表里边了有木有?!
列表推导式( List comprehensions )也叫列表解析,灵感取自函数式编程语言Haskell 。Ta 是一个非常有用和灵活的工具, 可以用来动态的创建列表, 语法如:
[有关 A 的表达式 for A in B]
例如
1. list1 = [x**2 for x in range(10)]
2. list1
3. [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
相当于
1. list1 = []
2. for x in range(10):
3. list1.append(x**2)
复制代码
问题:请先在 IDLE 中获得下边列表的结果,并按照上方例子把列表推导式还
原出来。
list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]
1. list1 = []
2. for x in ragne(10):
3. for y in range(10):
4. if x%2 == 0:
5. if y%2 != 0:
6. list1.append((x, y))
6、请使用列表推导式补充被小甲鱼不小心涂掉的部分
1. >>> list3 = [name + ' :' + slogan[2:] for slogan in list1 for name in list2 if slogan[0] == name[0]]
测试题:
请用一句话描述什么是列表?再用一句话描述什么是元组?
列表:一个大仓库,你可以随时往里边添加和删除任何东西。
元组:封闭的列表,一旦定义,就不可改变(不能添加、删除或修改)。
什么情况下你需要使用元组而不是列表?
当我们希望内容不被轻易改写的时候,我们使用元组(把权力关进牢笼)。
当我们需要频繁修改数据,我们使用列表。
当元组和列表掉下水,你会救谁?
如果是我,我会救列表, 因为列表提供了比元组更丰富的内置方法, 这相当大的提高了编程的灵活性。
回头来看下元组, 元组固然安全, 但元组一定创建就无法修改 (除非通过新建一个元组来间接修改,但这就带来了消耗),而我们人是经常摇摆不定的,所以元组只有在特殊的情况才用到,平时还是列表用的多。
综上所述,小甲鱼会救列表(列表是美眉)。
创建一个元组,什么情况下逗号和小括号必须同时存在,缺一不可?
在拼接只有一个元素的元组的时候,例如我们课上举的例题:
1. >>> temp = ( ‘小甲鱼’ , ‘黑夜’ , ‘迷途’ , ‘小布丁’)
2. # 如果我想在“黑夜”和“迷途”之间插入“怡静”,我们应该:
3. >>> temp = temp[:2] + ( ‘怡静’ ,) + temp[2:]
x, y, z = 1, 2, 3 请问 x, y, z 是元组吗?
所有的多对象的、 逗号分隔的、没有明确用符号定义的这些集合默认的类型都是
元组,自己在 IDLE 中键入以下代码,并体会一下:
1. >>> x, y, z = 1, 2, 3
2.
3. >>> type(x)
4.
5. >>> h = x, y, z
6.
7. >>> type(h)
请写出以下情景中应该使用列表还是元组来保存数据:
1) 游戏中角色的属性:列表
2) 你的身份证信息:元组
3) 论坛的会员:列表
4) 团队合作开发程序,传递给一个你并不了解具体实现的函数的参数:元组
5) 航天火箭各个组件的具体配置参数:元组
6) NASA 系统中记录已经发现的行星数据:列表
Python3 木有“元组推导式”,为嘛?没必要丫,有了“列表推导式”已经足够了。
那为什么“ >>> tuple1 = (x**2 for x in range(10)) ”不会报错?
因为你误打误撞得到了一个生成器:
type(tuple1)
复制代码
关于生成器的概念小甲鱼今后会细讲,你可以尝试这么去访问我们刚刚的生成器:
注意, Python3 开始 next() 方法改为 _ _ next _ _() 哦
1. >>> tuple1.__next__() 2. 0 3. >>> tuple1.__next__() 4. 1 5. >>> tuple1.__next__() 6. 4 7. >>> tuple1.__next__() 8. 9 9. >>> tuple1.__next__() 10. 16 11. >>> tuple1.__next__() 12. 25 13. >>> tuple1.__next__() 14. 36
注意, Python3 开始 next() 方法改为 next() 哦~
tuple1.next()
tuple1.next()
tuple1.next()
tuple1.next()
tuple1.next()
tuple1.next()
tuple1.next()
0、还记得如何定义一个跨越多行的字符串吗(请至少写出两种实现的方法)?
方法一:
>>> str1 = ''' 待我长发及腰,将军归来可好?
此身君子意逍遥,怎料山河萧萧。
天光乍破遇,暮雪白头老。
寒剑默听奔雷,长枪独守空壕。
醉卧沙场君莫笑,一夜吹彻画角。
江南晚来客,红绳结发梢。 '''
方法二:
>>> str2 = ' 待卿长发及腰,我必凯旋回朝。 \
昔日纵马任逍遥,俱是少年英豪。 \
东都霞色好,西湖烟波渺。 \
执枪血战八方,誓守山河多娇。 \
应有得胜归来日,与卿共度良宵。 \
盼携手终老,愿与子同袍。 '
方法三:
>>> str3 = (' 待卿长发及腰,我必凯旋回朝。 '
'昔日纵马任逍遥,俱是少年英豪。 '
'东都霞色好,西湖烟波渺。 '
'执枪血战八方,誓守山河多娇。 '
'应有得胜归来日,与卿共度良宵。 '
'盼携手终老,愿与子同袍。 ')
1、三引号字符串通常我们用于做什么使用?
三引号字符串不赋值的情况下,通常当作跨行注释使用,例如:
1. ''' 这是一个三引号字符串用于注释的例子,
2. 例子虽然只是简简单单的一句话,
3. 却毫无遮掩地体现了作者用情至深,
4. 所谓爱至深处情至简! '''
5.
6. print("I love FishC.com!")
2、file1 = open(‘C:\windows\temp\readme.txt’, ‘r’) 表示以只读方式打开
“ C: readme.txt ”这个文本文件,但事实上这个语句会报错,知道为什么吗?你会如何修改?
会报错是因为在字符串中,我们约定“ t ”和“ r ”分别表示“横向制表符(TAB)”和“回车符”(详见:
http://bbs.fishc.com/thread-39140-1-1.html ),因此并不会按照我们计划的路径去打开文件。
Python 为我们铺好了解决的道路,只需要使用原始字符串操作符( R 或 r)即可:
file1 = open(r'C:\windows\temp\readme.txt', 'r')
3、有字符串: str1 = ’ 鱼 C 资源打包 ’ ,target="_blank"> 鱼 C 资源打包 ’ ,请问如何提取出子字符串:'www.fishc.com’
1. >>> str1[16:29]
4、如果使用负数作为索引值进行分片操作,按照第三题的要求你能够正确目测出结果吗?
1. >>> str1[-45:-32]
5、还是第三题那个字符串,请问下边语句会显示什么内容?
1. >>> str1[20:-36]
6、据说只有智商高于 150 的鱼油才能解开这个字符串(还原为有意义的字符串):
str1 = ‘i2sl54ovvvb4e3bferi32s56h;$c43.sfc67o0cm99’
1. >>> str1[::3]
这是序列(列表,字符串,元组)的通用操作——分片
object[x:y:step] 这里面,object 是要分片的对象,需要是一个序列,
x表示分片的起始位置,y表示分片的结束位置(包含x,不包含y),step表示步长(可以不指定)
如果将x置空,默认的起始位置就是0;如果将y置空,默认结束位置就是序列的结尾元素(包含结尾元素)
step可以不指定,此时默认为1,也可以指定为某个值
str1='i2sl54ovvvb4e3bferi32s56h;$c43.sfc67o0cm99'
这里面,x,y均置空,表示从0到结尾位置,就是str1全包含啦,3表示每次跳3个元素
对于字符串str1 开始元素就是‘i’ ,跳三个元素就是‘l’ ,再跳三个元素就是‘ o’,如此一直到结束的‘m’,所以返回的结果是'ilovefishc.com'
动动手:
1、请写一个密码安全性检查的脚本代码: check.py
# 密码安全性检查代码
#
# 低级密码要求:
# 1. 密码由单纯的数字或字母组成
# 2. 密码长度小于等于 8 位
#
# 中级密码要求:
# 1. 密码必须由数字、字母或特殊字符(仅限:
)任意两种组合
# 2. 密码长度不能低于 8 位
#
# 高级密码要求:
# 1. 密码必须由数字、字母及特殊字符(仅限:
)三种组合
# 2. 密码只能由字母开头
# 3. 密码长度不能低于 16 位
请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!
# 密码安全性检查代码
#
# 低级密码要求:
# 1. 密码由单纯的数字或字母组成
# 2. 密码长度小于等于 8 位
#
# 中级密码要求:
# 1. 密码必须由数字、字母或特殊字符(仅限:)任意两种组合
# 2. 密码长度不能低于 8 位
#
# 高级密码要求:
# 1. 密码必须由数字、字母及特殊字符(仅限:)三种组合
# 2. 密码只能由字母开头
# 3. 密码长度不能低于 16 位
symbols = r'''`!@#$%^&*()_+-=/*{}[]\|'";:/?,.<>'''
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
nums = '0123456789'
passwd = input("请输入密码:")
# 判断长度
length = len(passwd)
while passwd.isspace() or length == 0:
passwd = input(" 您输入的密码为空(或空格),请重新输入: ")
if len(passwd) <= 8:
flag_len = 1
elif 8 < len(passwd) < 16:
flag_len = 2
else:
flag_len = 3
flag_con = 0
# 判断是否包含特殊字符
for each in passwd:
if each in symbols:
flag_con += 1
break
# 判断是否包含字母
for each in passwd:
if each in chars:
flag_con += 1
break
# 判断是否包含数字
for each in passwd:
if each in nums:
flag_con += 1
break
while 1:
print(" 您的密码安全级别评定为: ", end='')
if flag_len == 1 or flag_con == 1:
print(" 低")
elif flag_len == 2 or flag_con == 2:
print(" 中")
else:
print(" 高")
print(" 请继续保持 ")
break
print("' 请按以下方式提升您的密码安全级别: \n\
\t1. 密码必须由数字、字母及特殊字符三种组合 \n\
\t2. 密码只能由字母开头 \n\
\t3. 密码长度不能低于 16 位'")
0、根据说明填写相应的字符串格式化符号
符 号 说 明
%c 格式化字符及其 ASCII 码
%s 格式化字符串
%d 格式化整数
%o 格式化无符号八进制数
%x 格式化无符号十六进制数
%X 格式化无符号十六进制数(大写)
%f 格式化定点数,可指定小数点后的精度
%e 用科学计数法格式化定点数
%E 作用同 %e,用科学计数法格式化定点数
%g 根据值的大小决定使用 %f 或者%e
%G 作用同 %g,根据值的大小决定使用 %F 或者%E
1、请问以下这行代码会打印什么内容?
>>> "{{1}}".format(" 不打印 ", " 打印 ")
{1}
2、以下代码中, a, b, c 是什么参数?
1. >>> "{a} love {b}.{c}".format(a="I", b="FishC", c="com")
2. 'I love FishC.com'
关键字参数
3、以下代码中, {0}, {1}, {2} 是什么参数?
1. >>> "{0} love {1}.{2}".format("I", "FishC", "com")
2. 'I love FishC.com'
位置参数
4、如果想要显示 Pi = 3.14 ,format 前边的字符串应该怎么填写呢?
1. ''.format('Pi = ', 3.1415)
动动手:
0、编写一个进制转换程序, 程序演示如下(提示,十进制转换二进制可以用 bin()这个 BIF):
1. q = True
2. while q:
3. num = input(' 请输入一个整数 (输入 Q 结束程序 ):')
4. if num != 'Q':
5. num = int(num)
6. print(' 十进制 -> 十六进制 : %d -> 0x%x' % (num, num))
7. print(' 十进制 -> 八进制 : %d -> 0o%o' % (num, num))
8. print(' 十进制 -> 二进制 : %d -> ' % num, bin(num))
9. else:
10. q = False
测试题:
0、我们根据列表、元祖和字符串的共同特点,把它们三统称为什么?
序列,因为他们有以下共同点:
1)都可以通过索引得到每一个元素
2)默认索引值总是从 0 开始(当然灵活的 Python 还支持负数索引)
3)可以通过分片的方法得到一个范围内的元素的集合
4)有很多共同的操作符(重复操作符、拼接操作符、成员关系操作符)
1、请问分别使用什么 BIF,可以把一个可迭代对象转换为列表、元祖和字符串?
list([iterable]) 把可迭代对象转换为列表
tuple([iterable]) 把可迭代对象转换为元祖
str(obj) 把对象转换为字符串
例如:
1. >>> temp = 'I love FishC.com!'
2. >>> list(temp)
3. ['I', ' ', 'l', 'o', 'v', 'e', ' ', 'F', 'i', 's', 'h', 'C', '.', 'c', 'o', 'm', '!']
2、你还能复述出“迭代”的概念吗?
所谓迭代, 是重复反馈过程的活动, 其目的通常是为了接近并到达所需的目标或结果。 每一
次对过程的重复被称为一次“迭代”, 而每一次迭代得到的结果会被用来作为下一次迭代的初始值。
3、你认为调用 max(‘I love FishC.com’) 会返回什么值?为什么?
会返回: 'v' ,因为字符串在计算机中是以 ASCII 码的形式存储( ASCII 对照表:
http://bbs.fishc.com/thread-41199-1-1.html ),参数中 ASCII 码值最大的是 'v' 对应的118 。
4、哎呀呀,现在的小屁孩太调皮了,邻居家的孩子淘气,把小甲鱼刚写好的代码画了个图案,麻烦各位鱼油恢复下啊,另外这家伙画的是神马吗?怎么那么眼熟啊!??
1. name = input(' 请输入待查找的用户名: ')
2. score = [[' 迷途 ', 85], [' 黑夜 ', 80], [' 小布丁 ', 65], [' 福禄娃娃 ', 95], [' 怡静 ', 90]]
3. IsFind = False
4.
5. for each in score:
6. if name in each:
7. print(name + ' 的得分是: ', each[1])
8. IsFind = True
9. break
10.
11. if IsFind == False:
12. print(' 查找的数据不存在! ')
动动手:
0、猜想一下 min() 这个 BIF 的实现过程
1. def min(x):
2. least = x[0]
3.
4. for each in x:
5. if each < least:
6. least = each
7.
8. return least
9.
10. print(min('123456789'))
关于函数的定义和使用在下一讲的课程中讲解, 目前只需要理解该 BIF 实现的原理即可。
1、视频中我们说 sum() 这个 BIF 有个缺陷,就是如果参数里有字符串类型的话就会报错,请写出一个新的实现过程,自动“无视”参数里的字符串并返回正确的计算结果
1. def sum(x):
2. result = 0
3.
4. for each in x:
5. if (type(each) == int) or (type(each) == float):
6. result += each
7. else:
8. continue
9.
10. return result
0、你有听说过 DRY 吗?
DRY 是程序员们公认的指导原则: Don't Repeat Yourself.
快快武装你的思维吧,拿起函数,不要再去重复拷贝一段代码了!
1、都是重复一段代码,为什么我要使用函数(而不使用简单的拷贝黏贴)呢?
使用函数 :
0) 可以降低代码量(调用函数只需要一行,而拷贝黏贴需要 N 倍代码)
1) 可以降低维护成本(函数只需修改 def 部分内容,而拷贝黏贴则需要每一处出现的地方
都作修改)
2) 使序更容易阅读(没有人会希望看到一个程序重复一万行“ I love FishC.com "
2、函数可以有多个参数吗?
可以的, 理论上你想要有多少个就可以有多少个, 只不过如果函数的参数过多, 在调用的时候出错的机率就会大大提高, 因而写这个函数的程序员也会被相应的问候祖宗, 所以,尽量精简吧,在 Python 的世界里,精简才是王道!
3、创建函数使用什么关键字,要注意什么?
1. def MyFun():
2. # 我是函数体
3. # 我也是函数体
4. # 我们都属于函数 MyFun()
5.
6. # 噢,我不属于 MyFun() 函数的了
4、请问这个函数有多少个参数?
1. def MyFun((x, y), (a, b)):
2. return x * y - a * b
如果你回答两个,那么恭喜你错啦,答案是 0,因为类似于这样的写法是错误的!
我们分析下, 函数的参数需要的是变量, 而这里你试图用“元祖”的形式来传递是不可行的。
我想你如果这么写,你应该是要表达这么个意思
1. >>> def MyFun(x, y):
2. return x[0] * x[1] - y[0] * y[1]
3.
4. >>> MyFun((3, 4), (1, 2))
5. 10
5、请问调用以下这个函数会打印什么内容?**
1. >>> def hello():
2. print('Hello World!')
3. return
4. print('Welcome To FishC.com!')
会打印
1. >>> hello()
2. Hello World!
动动手:
1、编写一个函数 power() 模拟内建函数 pow() ,即 power(x, y) 为计算并返回 x 的 y 次幂的值。
def power(x, y):
return x ** y
print(power(2, 3))
2、编写一个函数,利用欧几里得算法( 脑补链接 )求最大公约数,例如 gcd(x, y) 返回值为参数 x 和参数 y 的最大公约数。
def gcd(x, y):
while y:
t = x % y
x = y
y = t
return x
print(gcd(4, 6))
3、编写一个将十进制转换为二进制的函数,要求采用“除 2 取余”( 脑补链接 )的方式,结果与调用 bin() 一样返回字符串形式。
def tentotwo(dec):
temp = []
result = ''
while dec:
quo = dec % 2
dec = dec // 2
temp.append(quo)
while temp:
result += str(temp.pop())
return result
print(tentotwo(62))
测试题:
0、请问哪个是形参,哪个是实参
def MyFun(x):
return x**3
y=3
print(print(y))
x形参 y实参
跟绝大部分编程语言一样,形参指的是函数创建和定义过程中小括号里的参数,而实参指的是函数在调用过程中传递进"去的参数.
1、函数文档和直接用“#”为函数写注释有什么不同?
给函数写文档是为了让别人可以更好的理解你的函数,所以这是一个好习惯:
>>> def Add(x,y):
'add two numbers'
return x+y
我们看到在函数开头写下的字符串Ta是不会打印出来的,但Ta会作为函数的一部分存储起来,这个我们称之为函数文档字符串,Ta的功能跟注释是一样的。
函数的文档字符串可以按如下方式访问:
>>> Add.__doc__
'add two numbers'
另外,我们用help()来访问这个函数也可以看到这个文档字符串:
>>> help(Add)
Help on function Add in module __main__:
Add(x, y)
add two numbers
>>>
2、使用关键字参数,可以有效避免什么问题的出现?
关键字参数,是指函数在调用的时候,带上参数的名字去指定具体调用的是哪个参数,从而可以不用按照参数的顺序调用函数,例如:
>>> def SaySome(name, words):
print(name + '->' + words)
>>> SaySome(words='让编程改变世界!', name='小甲鱼')
使用关键字参数,可以有效避免因不小心搞乱参数的顺序导致的BUG出现.
3、使用help(print)查看print()这个bif有那些默认参数?分别起到什么作用?
>>> help(print)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
# 文件类型对象,默认是sys.stdout(标准输出流)
sep: string inserted between values, default a space.
# 第一个参数如果有多个值(第一个参数是收集参数),各个值之间默认用空格(space)隔开
end: string appended after the last value, default a newline.
# 打印最后一个值之后默认参数一个新行标识符(‘\n’)
flush: whether to forcibly flush the stream.
# 是否强制刷新流
4、默认参数和关键字参数表面最大的区别是什么?
答:默认参数是赋予形式参数默认值,关键字参数是使得实际参数与形参相对应而避免顺序错误引发的系统报错。
关键字参数是在函数调用的时候,通过参数名制定需要赋值的参数,这样做就不怕因为搞不清参数的顺序而导致函数调用出错。而默认参数是在参数定义的过程中,为形参赋初值,当函数调用的时候,不传递实参,则默认使用形参的初始值代替。
动动手:
1、编写一个符合以下要求的函数
a)计算打印所有参数的和乘以奇数的结果
b)如果参数中最后一个参数为(base=5),则设定基数为5,基数不参入求和计算
def Sum(*params,base=3):
result = 0
for i in params:
result += i
result *= base
print('结果是:', result)
Sum(1, 2, 3, 4, 5)
Sum(1, 2, 3, 4, 5, base=5)
输出:
结果是: 45
结果是: 75
2、寻找水仙花数
题目要求:如果一个3位数等于其各位数字的立方和,则称这个数为水仙花数。例如153 = 1^3+53+33,因此153是一个水仙花数。编写一个程序,找出所有的水仙花数。
#第一种方法:
def Daffodils():
print('所有的水仙花数为:',end='')
temp = 100
while temp < 1000:
if temp == (temp//100)**3 + ((temp%100)//10)**3 + (temp%10)**3:
print(temp,end=' ')
temp += 1
else:
temp += 1
Daffodils()
#第二种方法(更好):
def Nacissus():
print('所有的水仙花数为:',end='')
for each in range(100, 1000):
temp = each
sum = 0
while temp:
sum = sum + (temp % 10) ** 3
temp = temp // 10 #注意这里是地板除
if sum == each:
print(each, end=' ')
Nacissus()
#第三种方法:一行代码
a = [i**3+j**3+k**3 for i in range(1, 10) for j in range(0, 10) for k in range(0, 10) if i*100+j*10+k == i**3+j**3+k**3]
print(a)
3.编写一个函数findstro ,该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串·为"You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted." ,子字符串为"im" ,函数执行后打印“子字母甲在目标字符串中共出现3次
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8IHL9MBg-1592991150370)(C:\Users\19674\AppData\Roaming\Typora\typora-user-images\image-20200610143347628.png)]
#第一种方法
def findstr():
print('请输入目标字符串:',end='')
temp = input()
print('请输入子字符串(两个字符):',end='')
comp = input()
count = 0
i = 0
for i in range(len(temp)):
if temp[i] == comp[0] and temp[i+1] == comp[1]:
count += 1
i += 1
else:
i += 1
count = int(count)
print('子字符串在目标字符串中总共出现 %d 次'%count)
findstr()
#第二种方法:不管大小写
def findStr(desStr, subStr):
count = 0
length = len(desStr)
if subStr not in desStr:
print('在目标字符串中未找到字符串!')
else:
for each1 in range(length):
if desStr[each1].upper() == subStr[0].upper():
if desStr[each1+1].upper() == subStr[1].upper():
count += 1
print('子字符串在目标字符串中共出现 %d 次' % count)
desStr = input('请输入目标字符串:')
subStr = input('请输入子字符串(两个字符):')
findStr(desStr, subStr)
下边程序会输入什么?
def next():
print('我在next()函数里...')
pre()
def pre():
print('我在pre()函数里...')
next()
我在next()函数里...
我在pre()函数里...
请问以下这个函数有返回值吗?
def hello():
print('Hello FishC!')
答:有。 会返回一个None的对象。如果没有使用return语句指定返回值,Python也不是什么都不返回的,Ta会返回一个None对象,所以我们说Python所有的函数都有返回值。
>>> def hello():
print("hello fishc")
>>> temp = hello()
hello fishc
>>> temp
>>> print(temp)
None
>>>
请问Python的return语句可以返回多个不同类型的值吗?
答:可以,默认用逗号隔开,是以元祖的形式返回,你当然也可以用列表包含起来返回。
>>> def myFun():
return '测试测试', 520, 3.14, True
>>> myFun()
('测试测试', 520, 3.14, True)
>>> def myFun2():
return ['小甲鱼', 1314, 5.12, False]
>>> myFun2()
['小甲鱼', 1314, 5.12, False]
>>>目测以下程序会打印什么内容:
3… 目测以下程序会打印什么内容:
def fun(var):
var = 1314
print(var, end='')
var = 520
fun(var)
print(var)
4.目测以下程序会打印什么内容?
var = ' Hi '
def fun1():
global var
var = ' Baby '
return fun2(var)
def fun2(var):
var += 'I love you'
fun3(var)
return var
def fun3(var):
var = ' 小甲鱼 '
print(fun1())
Baby I love you
小甲鱼建议不到万不得已不要使用全局变量,简洁的概括为:
a)代码可读性变差
b)代码安全性降低以下关于全局变量的危言耸听是转来的,大家不妨也看下:
a)它会造成不必要的常量频繁使用,特别当这个常量没有用宏定义"正名"时,代码阅读起来将万分吃力.
b)它会导致软件分层的不合理,全局变量相当于条快捷通道,它容易使程序员模糊了"设备层"和"应用层"之间的边界。写出来的底层程序容易自作多情地关注起上层的应用,这在软件系统的构建初期的确效率很高,功能调试进度·一日千里,但到了后期往往bug一堆,处处“补丁" ,雷区遍布。说是度日如年举步维艰也不为过。
c)由于软件的分层不合理,到了后期维护,哪怕仅是增加修改删除小功能,往往要从上到下掘地三尺地修改,涉及大多数模块,而原有的代码注释却忘了更新修改,这个时候,交给后来维护者的系统会越来越像一个“泥潭" ,注释的唯一作用只是使泥潭上方再加一些迷烟章气
d)全局变量大量使用,少不了有些变量流连忘返于中断与主回圈程序之间,这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏高的特征来了,没有大牛来力挽狂润,注定慢性死亡
e)无需多言,如果您的系统中大量使用全局变量,那么您已经成功得到一个畸形的系统,它处于一个神秘的稳定状态!你看着这台机器,机器也看着你,相对无言,心中发毛。你不确定它什么时候会崩溃,也不晓得下一次投诉什么时。
编程题
编写一个函数,判断传入的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,既可顺读,也可倒读。例如:上海自来水来自海上)。
def palindrome(string):
length = len(string)
last = length-1
length //= 2
flag = 1
for each in range(length):
if string[each] != string[last]:
flag = 0
last -= 1
if flag == 1:
return 1
else:
return 0
string = input('请输入一句话:')
if palindrome(string) == 1:
print('是回文联!')
else:
print('不是回文联!')
代码二
def palindrome(string):
list1 = list(string)
list2 = reversed(list1)
if list1 == list(list2):
return '是回文联'
else:
return '不是回文联'
print(palindrome('1234abcdedcba4321'))
编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数。
def count(*param):
length = len(param)
for i in range(length):
word = 0
num = 0
spa = 0
oth = 0
for j in param[i]:
if j.isalpha():
word += 1
elif j.isspace():
spa += 1
elif j.isdigit():
num += 1
else:
oth += 1
print('第 %d 个字符串共有:英文字母 %d 个,数字 %d 个,空格 %d 个,其他字符 %d 个'
% (i + 1, word, num, spa, oth))
count('I love fish.com 123', 'I love you', 'you love 123')
第 1 个字符串共有:英文字母 12 个,数字 3 个,空格 3 个,其他字符 1 个
第 2 个字符串共有:英文字母 8 个,数字 0 个,空格 2 个,其他字符 0 个
第 3 个字符串共有:英文字母 7 个,数字 3 个,空格 2 个,其他字符 0 个
0.如果希望在函数中修改全局变量的值,应该使用什么关键字?
global
>>> count=5
>>> def MyFun():
global count
count=10
print (count)
>>> MyFun()
10
>>> count
10
1.在嵌套的函数中,如果希望在内部函数修改外部困数的局部变量,应该使用什么关键字?
nonlocal
>> def Fun1():
x=5
def Fun2():
nonlocal x
x*=x
return x
return Fun2()
>>> Fun1()
25
2.Python的函数可以嵌套,但要注意访问的作用域问题哦,请问以下代码存在什么问塾呢?
def outside():
print ('I am outside! )
def inside():
print('I am inside!')
inside()
使用嵌套函数要注意一点就是作用域问题, inside0函数是内嵌在outside0函数中的,所以inside0是人妻,除了身为老公的outside0可以碰(调用) ,在外边或者别的函数体里是无法对其进行调用的。
正确的调用
def outside():
print ('I am outside! )
def inside():
print('I am inside!')
inside()
outside()
3.请问为什么代码A没有报错,但代码B却报错了?应该如何修改?
A
def outside():
var =5
def inside():
var=3
print (var)
inside()
outside()
B
def outside():
var=5
def inside():
print (var)
var=3
inside()
outside()
仔细一看报错的内容是: UnboundLocalError local variable ‘var’ referenced before assignment,说的是变量var没有被定义就拿来使用,肯定错啦!
这里outside()函数里有一个var变量,但要注意的是,内嵌函数inside()也有一个同名的变量, Python为了保护变量的作用域,故将outside()的var变量屏蔽起来,因此此时是无法访问到外层的var变量的
4,请问如何访回funIn()呢?
def funout():
def funIn():
print ("宾果!你成功访问到找啦! .)
return funin()
funout()
'宾果!你成功访问到我啦!
5.请问如何访问funout()呢?
funout()()
'宾果!你成功访问到我啦!
6.下是"闭包"的一个例子,请你目测下么内容?
def funx():
x=5
def funY():
nonlocal x
x +=1
return x
return funY
a=funx()
print(a())
print(a())
print(a())
6
7
8
有些鱼油可能会比较疑感, 怎么跟全局变量一样了?局部变量x不是应该在每次调用的时候都重新初始化了吗?!
其实大家仔细看看就明白了,当a = funxO的时候,只要a变量没有被重新赋值, funx0就没有被释放,也就是说局部变量x就没有被重新初始化。
所以当全局变量不适用的时候,可以考虑使用闭包更稳定和安全,你还可以参考->遊戏中的角色移动
0.请用已学过的知识编写程序,统计下边这个长字符中各个字符出现的次数井找到小甲鱼送给大家的一句话。
str1= ''''''拷贝过来的字符串'''
list1 =[]
for each in str1:
if each not in list1:
if each =='\n:
print("\\n', str1. count (each))
else:
print(each, str1.count (each))
list1. append(each)
1.请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符术中的密码,密码的埋藏点符合以下规律:
a)每位密码为单个小写字母
b)每位密码的左右两边均有且只有三个大写字母
str1='''拷贝过来的字符串'''
countA =0
countB=0
countc=0
length = len(str1)
for i in range(length):
if str1[i]=='\n':
continue
if str1[i].isupper():
if countB ==1:
countC += 1
countA=0
else:
countA +=1
continue
if str1[i].islower() and countA=3:
countB=1
countA=0
target=1
continue
if str1[i].islower() and countc == 3:
print (str1[target], end='')
countA=0
countB =0
countc=0
am outside! )
def inside():
print(‘I am inside!’)
inside()
outside()
3.请问为什么代码A没有报错,但代码B却报错了?应该如何修改?
```python
A
def outside():
var =5
def inside():
var=3
print (var)
inside()
outside()
B
def outside():
var=5
def inside():
print (var)
var=3
inside()
outside()
仔细一看报错的内容是: UnboundLocalError local variable ‘var’ referenced before assignment,说的是变量var没有被定义就拿来使用,肯定错啦!
这里outside()函数里有一个var变量,但要注意的是,内嵌函数inside()也有一个同名的变量, Python为了保护变量的作用域,故将outside()的var变量屏蔽起来,因此此时是无法访问到外层的var变量的
4,请问如何访回funIn()呢?
def funout():
def funIn():
print ("宾果!你成功访问到找啦! .)
return funin()
funout()
'宾果!你成功访问到我啦!
5.请问如何访问funout()呢?
funout()()
'宾果!你成功访问到我啦!
6.下是"闭包"的一个例子,请你目测下么内容?
def funx():
x=5
def funY():
nonlocal x
x +=1
return x
return funY
a=funx()
print(a())
print(a())
print(a())
6
7
8
有些鱼油可能会比较疑感, 怎么跟全局变量一样了?局部变量x不是应该在每次调用的时候都重新初始化了吗?!
其实大家仔细看看就明白了,当a = funxO的时候,只要a变量没有被重新赋值, funx0就没有被释放,也就是说局部变量x就没有被重新初始化。
所以当全局变量不适用的时候,可以考虑使用闭包更稳定和安全,你还可以参考->遊戏中的角色移动
0.请用已学过的知识编写程序,统计下边这个长字符中各个字符出现的次数井找到小甲鱼送给大家的一句话。
str1= ''''''拷贝过来的字符串'''
list1 =[]
for each in str1:
if each not in list1:
if each =='\n:
print("\\n', str1. count (each))
else:
print(each, str1.count (each))
list1. append(each)
1.请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符术中的密码,密码的埋藏点符合以下规律:
a)每位密码为单个小写字母
b)每位密码的左右两边均有且只有三个大写字母
str1='''拷贝过来的字符串'''
countA =0
countB=0
countc=0
length = len(str1)
for i in range(length):
if str1[i]=='\n':
continue
if str1[i].isupper():
if countB ==1:
countC += 1
countA=0
else:
countA +=1
continue
if str1[i].islower() and countA=3:
countB=1
countA=0
target=1
continue
if str1[i].islower() and countc == 3:
print (str1[target], end='')
countA=0
countB =0
countc=0