笨办法学python习题0~习题39
习题0:准备工作
总有一天你会听到有程序员建议你使用 Mac OSX 或者 Linux。如果他喜欢字体美观,他会告诉你让你弄台 Mac OSX 计算机,如果他们喜欢操作控制而且留了一部大胡子,他会让你安装 Linux。这里再次向你说明,只要是一台手上能用的电脑就可以了。你需要的只有三样东西: gedit、一个命令行终端、还有 python。
习题1:第一个程序
学会看调试的错误信息
这些内容你应该学会看懂的,这是很重要的一点,因为你以后还会犯类似的错误。
python调试错误格式:
- 会打印出错误的行
- 指示错误的地方
- 指示错误的类型
习题2:注释和井号
中文为井号,英文为 octothorpe 或者 pound characte
程序里的注释是很重要的。它们可以用自然语言告诉你某段代码的功能是什么。在你想要临时移除一段代码时,你还可以用注解的方式将这段代码临时禁用
中文为井号,英文为 octothorpe 或者 pound characte
习题 3: 数字和数学计算
每一种编程语言都包含处理数字和进行数学计算的方法。不必担心,程序员经常撒谎说他们是多么牛的数学天才,其实他们根本不是。
如果他们真是数学天才,他们早就去从事数学相关的行业了,而不是写写广告程序和社交网络游戏,从人们身上偷赚点小钱而已。
加分习题
由于本教材使用的是 python2.x 未定属性为浮点数的情况默认整数
而本机使用python3.x 整数运算自动精确到小数点后17位~
习题4:变量(variable)和命名
在编程中,变量只不过是用来指代某个东西的名字。程序员通过使用变量名可以让他们的程序读起来更像英语。而且因为程序员的记性都不怎么地,变量名可以让他们更容易记住程序的内容。
如果他们没有在写程序时使用好的变量名,在下一次读到原来写的代码时他们会大为头疼的。
space_in_a_car 中的 _ 是 下划线(underscore) 字符。你要自己学会怎样打出这个字符来。这个符号在变量里通常被用作假想的空格,用来隔开单词。
记住 = 的名字是等于(equal),它的作用是为东西取名。
记住 _ 是下划线字符(underscore)。
习题5:更多的变量和打印
这次我们将使用一个叫“格式化字符串(format string)”的东西. 每一次你使用 " 把一些文本引用起来,你就建立了一个字符串。 字符串是程序将信息展示给人的方式。你可以打印它们,可以将它们写入文件,还可以将它们发送给网站服务器,很多事情都是通过字符串交流实现的。
外链索引
在编写程序的过程中,经常需要进行格式化输出,每次用每次查。干脆就在这里整理一下,以便索引。
This is python格式字符串 reference-style link.
习题6:字符串(string)和文本
字符串通常是指你想要展示给别人的、或者是你想要从程序里“导出”的一小段字符。Python 可以通过文本里的双引号 " 或者单引号 ' 识别出字符串来。这在你以前的 print 练习中你已经见过很多次了。如果你把单引号或者双引号括起来的文本放到 print 后面,它们就会被 python 打印出来。
字符串可以包含格式化字符 %s,这个你之前也见过的。你只要将格式化的变量放到字符串中,再紧跟着一个百分号 % (percent),再紧跟着变量名即可。唯一要注意的地方,是如果你想要在字符串中通过格式化字符放入多个变量的时候,你需要将变量放到 ( ) 圆括号(parenthesis)中,而且变量之间用 , 逗号(comma)隔开。就像你逛商店说“我要买牛奶、面包、鸡蛋、八宝粥”一样,只不过程序员说的是”(milk, eggs, bread, soup)”。
我们将键入大量的字符串、变量、和格式化字符,并且将它们打印出来。我们还将练习使用简写的变量名。程序员喜欢使用恼人的难度的简写来节约打字时间,所以我们现在就提早学会这个,这样你就能读懂并且写出这些东西了。
习题 7: 更多打印
习题 8: 打印,打印
习题 9: 打印,打印,打印
先说1双引号与3个双引号的区别,双引号所表示的字符串通常要写成一行
如:
s1 = "hello,world"
如果要写成多行,那么就要使用/ (“连行符”)吧,如
s2 = "hello,/
world"
s2与s1是一样的。如果你用3个双引号的话,就可以直接写了,如下:
s3 = """hello,
world,
hahaha.""",那么s3实际上就是"hello,/nworld,/nhahaha.", 注意“/n”,所以,
如果你的字符串里/n很多,你又不想在字符串中用/n的话,那么就可以使用3个双
引号。而且使用3个双引号还可以在字符串中增加注释,如下:
s3 = """hello, #hoho, this is hello, 在3个双引号的字符串内可以有注释哦
world, #hoho, this is world
hahaha."""
这就是3个双引号和1个双引号表示字符串的区别了,3个双引号与1个单引号的区别也
是和这个一样的,实际上python支持单引号是有原因的,下面我来比较1个单引号和 1个双引号的区别。
当我用单引号来表示一个字符串时,如果要表示 Let's go 这个字符串,必须这样:
s4 = 'Let/'s go',注意没有,字符串中有一个',而字符串又是用'来表示,所以
这个时候就要使用转义符 / (/,转义符应该知道吧), 如果你的字符串中有一大堆
的转义符,看起来肯定不舒服,python也很好的解决了这个问题,如下:
s5 = "Let's go"
这时,我们看,python知道你是用 " 来表示字符串,所以python就把字符串中的那
个单引号 ' , 当成普通的字符处理了,是不是很简单。
对于双引号,也是一样的,下面举个例子
s6 = 'I realy like "python"!'
这就是单引号和双引号都可以表示字符串的原因了。
习题 10: 那是什么?
\t的作用是拉空格
\作用是打印一个\
习题 11: 提问
一般软件做的事情主要就是下面几条:
- 接受人的输入
- 改变输入。
- 打印出改变了的输入。
注意到我在每行 print 后面加了个逗号(comma) , 了吧?这样的话 print 就不会输出新行符而结束这一行跑到下一行去了。
习题 12: 提示别人
当你键入 raw_input() 的时候,你需要键入 ( 和 ) 也就是“括号(parenthesis)”。这和你格式化输出两个以上变量时的情况有点类似,比如说 "%s %s" % (x, y) 里边就有括号。对于 raw_input 而言,你还可以让它显示出一个提示,从而告诉别人应该输入什么东西。你可以在 () 之间放入一个你想要作为提示的字符串
现在的搜索引擎这么发达,为什么还要使用Python自带的帮助系统呢?因为:1)利用搜索引擎搜出的结果往往太宽泛,不聚焦,一些论坛和blog给出的结论往往会针对一些过时的版本,但又不指明,有的还有一些typos,这样就增大了解决问题的时间;2)利用搜索引擎需要联网,自带的就非常方便,随时都陪在你的身边;3)自带的帮助系统给出的结果可靠,准确和版本一致。基于以上的原因,我们仍然需要掌握自带帮助系统的使用方法。
习题 13: 参数、解包、变量
from sys import argv
script, first, second, third = argv
print("The script is called :", script)
print("your first variable is :", first)
print("your second variable is :", second)
print("your third variable is :", third)
命令行输入下的结果1 命令行输入下的结果2在第 1 行我们有一个“import”语句. 这是你将 python 的功能引入你的脚本的方法. Python 不会一下子将它所有的功能给你,而是让你需要什么就调用什么。这样可以让你的程序保持精简,而后面的程序员看到你的代码的时候,这些“import”可以作为提示,让他们明白你的代码用到了哪些功能。
argv 是所谓的“参数变量(argument variable)”,是一个非常标准的编程术语。在其他的编程语言里你也可以看到它。这个变量包含了你传递给 Python 的参数。通过后面的练习你将对它有更多的了解。
第 3 行将 argv “解包(unpack)”,与其将所有参数放到同一个变量下面,我们将每个参数赋予一个变量名: script, first, second, 以及 third。这也许看上去有些奇怪, 不过”解包”可能是最好的描述方式了。它的含义很简单:“把 argv 中的东西解包,将所有的参数依次赋予左边的变量名”。
在pycharm里面运行命令行:
Run/Debug Configurations->Configurations->Script Parames
结果:
The script is called : C:/Users/Administrator.WENNRK2ZC0P1OB5/PycharmProjects/untitled/python/Python learning/ex13.py
your first variable is : apple
your second variable is : cheese
your third variable is : pig
当输入错误信息时:例如少输入一个参数时
当你运行脚本时提供的参数的个数不对的时候,你就会看到上述错误信息 (这次我只用了
first 2nd 两个参数)。“need more than 3 values to unpack”这个错误信息告诉你参数数量不足。
等一下!“功能”还有另外一个名字
前面我们使用 import 让你的程序实现更多的功能,但实际上没人吧 import 称为“功能”。我希望你可以在没接触到正式术语的时候就弄懂它的功能。在继续下去之前, 你需要知道它们的真正名称:模组(modules)。
从现在开始我们将把这些我们导入(import)进来的功能称作模组。你将看到类似这样的说法:“你需要把 sys 模组 import 进来。”也有人将它们称作“库(libraries)”,不过我们还是叫它们模组吧。
习题 14: 提示和传递
输出
习题15:读取文件
读取文件输入输出如下代码:
from sys import argv
script, filename = argv
txt = open(filename)
print "Here's your file %r:" % filename
print txt.read()
print "Type the filename again:"
file_again = raw_input("> ")
txt_again = open(file_again)
print txt_again.read()
我使用了“命令”这个词,不过实际上它们的名字是“函数(function)”和“方法(method)。上网搜索一下这两者的意义和区别。看不明白也没关系,迷失在别的程序员的知识海洋里是很正常的一件事情
下附链接:
函数与方法区别
习题16:读写文件
输入输出结果你应该记住的命令如下:
- close – 关闭文件。跟你编辑器的 文件->保存.. 一个意思。
- read – 读取文件内容。你可以把结果赋给一个变量。
- readline – 读取文本文件中的一行。
- truncate – 清空文件,请小心使用该命令。
- write(stuff) – 将stuff写入文件。
代码执行的操作流程为:打开-清空-写入-关闭
练习代码:
#python ex16_practice.py ex15_sample.txt
from sys import argv
script,filename = argv
txt =open(filename)
print(txt.read())
txt.close()
上述代码输出结果:
输出结果加分习题中的第三题:
文件中重复的地方太多了。试着用一个 target.write() 将 line1, line2, line3 打印出来,你可以使用字符串、格式化字符、以及转义字符。
Python新旧两种格式化输出:
旧%格式串:
target.write('%s\n%s\n%s\n' %(line1,line2,line3))
新format()格式串:
target.write('{0}\n{1}\n{2}\n'.format(line1,line2,line3))
找出为什么我们需要给 open 多赋予一个 'w' 参数。提示: open 对于文件的写入操作态度是安全第一,所以你只有特别指定以后,它才会进行写入操作
target = open(filename, 'w')
习题17:更多文件操作
- 通过import导入更多功能,复用现成功能,而不是浪费时间再造轮子也是写程序很重要的一个思想。
- 首次用到exists功能。可以判断文件是否存在,返回一个布尔值。
加分习题:
1.再多读读和 import 相关的材料,将 python 运行起来,试试这一条命令。试着看看自己能不能摸出点门道,当然了,即使弄不明白也没关系。
*模块和包的参考文档:http://wiki.woodpecker.org.cn/moin/PythonEssentialRef8
import当然是用来引入各种模块、包,从而使用其中包含的方法,定义的数据等。具体等日后丰富。
2.这个脚本 实在是 有点烦人。没必要在拷贝之前问一遍把,没必要在屏幕上输出那么多东西。试着删掉脚本的一些功能,让它使用起来更加友好。
'''''
3.看看你能把这个脚本改多短,我可以把它写成一行。from sys import argv script, from_file, to_file = argv open(to_file,'w').write(open(from_file).read())
4.我使用了一个叫 cat 的东西,这个古老的命令的用处是将两个文件“连接(concatenate)”到一起,不过实际上它最大的用途是打印文件内容到屏幕上。你可以通过 man cat 命令了解到更多信息。
'''
5.使用 Windows 的同学,你们可以给自己找一个 cat 的替代品。关于 man 的东西就别想太多了,Windows 下没这个命令。
'''
6.找出为什么你需要在代码中写 output.close() 。
收回资源
习题 18: 命名、变量、代码、函数
函数可以做三样事情:
- 它们给代码片段命名,就跟“变量”给字符串和数字命名一样。
- 它们可以接受参数,就跟你的脚本接受 argv 一样。
- 通过使用 #1 和 #2,它们可以让你创建“微型脚本”或者“小命令”。
为自己写一个函数注意事项以供后续参考。你可以写在一个索引卡片上随时阅读,直到你记住所有的要点为止。注意事项如下:
函数定义是以 def 开始的吗?是的
函数名称是以字符和下划线 _ 组成的吗?可以,但不一定
函数名称是不是紧跟着括号 ( ?不一定,紧跟或不紧跟都可以
括号里是否包含参数?多个参数是否以逗号隔开?可以
参数名称是否有重复?(不能使用重复的参数名)''''
紧跟着参数的是不是括号和冒号 ): ?是的
紧跟着函数定义的代码是否使用了 4 个空格的缩进 (indent)?是的
函数结束的位置是否取消了缩进 (“dedent”)?是的
当你运行(或者说“使用 use”或者“调用 call”)一个函数时,记得检查下面的要点:
- 调运函数时是否使用了函数的名称?
- 函数名称是否紧跟着 ( ?
- 括号后有无参数?多个参数是否以逗号隔开?
- 函数是否以 ) 结尾?
- 按照这两份检查表里的内容检查你的练习,直到你不需要检查表为止。
最后,将下面这句话阅读几遍:
“‘运行函数(run)’、‘调用函数(call)’、和 ‘使用函数(use)’是同一个意思”
习题19:函数和变量
有一个你可能没有注意到的细节,我们现在强调一下:函数里边的变量和脚本里边的变量之间是没有连接的
函数里的变量是局部变量,而脚本里的变量叫全局变量。
例如在某一函数里,虽然定义的变量名与脚本中定义的变量名相同,但脚本中的变量的赋值并不影响函数中的变量名的值。反过来函数中也不影响脚本中的变量名。
以下为例子:
举例 #python ex19.py
from sys import argv
script,cheese_count,boxes_of_crackers = argv
print("there is the firsr raw %s,%s" % (cheese_count,boxes_of_crackers))
def cheese_and_crackers(cheese_count, boxes_of_crackers):
print("You have %d cheeses!" % cheese_count)
print("You have %d boxes of crackers!" % boxes_of_crackers)
print("Man that's enough for a party!")
print("Get a blanket.\n")
print("We can just give the functio n numbers directly:")
cheese_and_crackers(20, 30)
习题20:函数和文件
加分习题:
1.通读脚本,在每行之前加上注解,以理解脚本里发生的事情。
2.每次 print_a_line 运行时,你都传递了一个叫 current_line 的变量。
在每次调用函数时,打印出 current_line 的值,跟踪一下它在 print_a_line 中是怎样变成 line_count 的。
"current_line"这个变量作为"print_a_line"的参数传递一个值给"print_a_line"方法,在这个方法中会把值赋给"line_count"变量,参与计算。3.找出脚本中每一个用到函数的地方。检查 def 一行,确认参数没有用错。
4.上网研究一下 file 中的 seek 函数是做什么用的。试着运行 pydoc file 看看能不能学到更多。
#seek 函数是用来指定文件位置的函数,使用方法
#seek (offset[, whence])
#第一个值(offset)用来指定偏移的大小,可有正负。
#第二个值(whence)用来指定开始位置,'0'代表绝对开始位置(默认值),'1'代表当前指针所在位置,'2'代表绝对结束位置。
#例字符串[abcdefg],当读取到abcd时,使用seek(0),那么就能回到a之前,此时打印全部就能打印出[abcdefg]
#这时使用seek(0,1),就相当于当前位置,等于没变化。
#这是使用seek(2,1),就相当于从在当前位置往后三个位置,也就是从g开始,此时能够输出g。
#这时使用seek(-2,2),就像先回到最末尾,然后往前两个位置,此时能够输出[fg]。
5.研究一下 += 这个简写操作符的作用,写一个脚本,把这个操作符用在里边试一下。
递增符号。已直接优化进代码。
例如定义了str=“woaini”
str+=“paste”意思就是str=“woaini”+“paste”
计算的结果重新赋给str
习题21:函数可以返回东西
返回值概念,这部分没有很大问题。
习题22:到现在你学到了哪些东西?
做这节练习没有失败,只有尝试,请牢记这一点。
"""三引号问题
如果你的字符串里/n很多,你又不想在字符串中用/n的话,那么就可以使用3个双
引号。而且使用3个双引号还可以在字符串中增加注释,如下:
s3 = """hello, #hoho, this is hello, 在3个双引号的字符串内可以有注释哦
world, #hoho, this is world
hahaha."""
\t的意思是空格
tabby_cat = "\tI'm tabbed in."
字符中单双引号的转义
print ("I am 6'2\" tall." ) # 将字符串中的双引号转义
print ('I am 6\'2" tall.') # 将字符串种的单引号转义
\的意思
backslash_cat = "I'm \\ a \\ cat."#only print one \
input()输入
age = input("How old are you? ")
height = input("How tall are you? ")
weight = input("How much do you weigh? ")
script 脚本
from sys import argv
sys 为内置模块,提供了许多函数和变量来处理 Python 运行时环境的不同部分。是固定的用法,不能自己随便写名字代替它,这行的作用就是要把用到的东西(比如需要什么特定函数什么之类的)从这个东西存放的模块中引入程序中。
argv就是列表(参数变量),是编程术语。在解释器启动后, argv 列表包含了传递给脚本的所有参数, 第一个元素为脚本自身的名称
truncate()方法
作用是清空txt文件
close()方法
收回资源
习题 23: 读代码
习题24:更多练习
习题25:更多更多的练习
加分习题
- 研究答案中没有分析过的行,找出它们的来龙去脉。确认自己明白了自己使用的是模组 ex25 中定义的函数。
- 试着执行 help(ex25) 和 help(ex25.break_words) 。这是你得到模组帮助文档的方式。 所谓帮助文档就是你定义函数时放在 """ 之间的东西,它们也被称作 documentation comments (文档注解),后面你还会看到更多类似的东西。
- 重复键入 ex25. 是很烦的一件事情。有一个捷径就是用 from ex25 import * 的方式导入模组。这相当于说:“我要把 ex25 中所有的东西 import 进来。”程序员喜欢说这样的倒装句,开一个新的会话,看看你所有的函数是不是已经在那里了。
- 把你脚本里的内容逐行通过 python 编译器执行,看看会是什么样子。你可以执行CTRL-D (Windows 下是 CTRL-Z)来关闭编译器。
习题26:恭喜你,现在可以考试了!
i'm pass the exam.
习题 27: 记住逻辑关系
习题28:布尔表达式练习
习题 29: 如果(if)
习题30:Else 和 If
习题 31: 作出决定
习题32:循环与列表
append()方法用于在列表末尾添加新的对象。
list1 = ['Google', 'Runoob', 'Taobao']
list1.append('Baidu')
print ("更新后的列表 : ", list1)
更新后的列表 : ['Google', 'Runoob', 'Taobao', 'Baidu']
range()方法函数可创建一个整数列表,一般用在 for 循环中。
>>>range(10) # 从 0 开始到 10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11) # 从 1 开始到 11
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5) # 步长为 5
[0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3) # 步长为 3
[0, 3, 6, 9]
>>> range(0, -10, -1) # 负数
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0)
[]
>>> range(1, 0)
[]
更多有关列表的函数可以参考:python3列表
习题33:While 循环
while 循环,它所作的和 if 语句类似,也是去检查一个布尔表达式的真假,不一样的是它下面的代码片段不是只被执行一次,而是执行完后再调回到 while 所在的位置,如此重复进行,直到 while 表达式为 False 为止
While 循环有一个问题,那就是有时它会永不结束。如果你的目的是循环到宇宙毁灭为止,那这样也挺好的,不过其他的情况下你的循环总需要有一个结束点。
为了避免这样的问题,你需要遵循下面的规定:
- 尽量少用 while-loop,大部分时候 for-loop 是更好的选择。
- 重复检查你的 while 语句,确定你测试的布尔表达式最终会变成 False 。
- 如果不确定,就在 while-loop 的结尾打印出你要测试的值。看看它的变化。
加分习题:
接下来使用 for-loop 和 range 把这个脚本再写一遍。你还需要中间的加值操作吗?如果你不去掉它,会有什么样的结果?
numbers=[]
def test_for_loop(i,newi):
for i in range(0,6):
print("At the top i is %r"%i)
numbers.append(i)
i=i+newi
print("numbers now :",numbers)
print("At the numbers i %d"%i)
print(test_for_loop(0,1))
print("The numbers:")
习题 34: 访问列表的元素
习题35:分支与函数
加分习题:
这个 gold_room 游戏使用了奇怪的方式让你键入一个数字。这种方式会导致什么样的 bug? 你可以用比检查 0、1 更好的方式判断输入是否是数字吗?int() 这个函数可以给你一些头绪。
if "0" in next or "1" in next:
how_much = int(next)
else:
dead("Man, learn to type a number.")
作者使用了如上代码来给how_much进行赋值。这样写的问题就是如果输入的是2、22这些不带0和1的数字,那么就会走入错误的逻辑分支。查了一下,用isdigit函数可以实现判断是否为数字的功能。如下:
if next.isdigit():
how_much = int(next)
exit()
exit(0):无错误退出
exit(1):有错误退出
退出代码是告诉解释器的(或操作系统)
习题 36: 设计和调试
WARNING
在日常编程中不要成为这些规则的奴隶。在训练中,你需要通过这些规则的应用来巩固你学到的知识,而在实际编程中这些规则有时其实很蠢。如果你觉得哪个规则很蠢,就别使用它。
if 规则
- 每个 if 语句必须包含一个else.
- if 语句嵌套尽量不要超过2层
- if 语句段的前后各保持一个空行,这个规则对其他语句段也适用,如函数、循环
- if 条件应尽量保持简单,若比较复杂,应先建立变量保存该值
如果else永远都执行不到,必须在else语句后面使用die函数
习题37:复习各种符号
各种符号参考
习题38:阅读代码
习题 39: 列表的操作
#字符串
ten_things = "Apples Oranges Crows Telephone Light Sugar"
#打印字符串
print "Wait there are not 10 things in that list. Let's fix that."
#以空格为分隔符,分解字符串中的子串,返回一个列表
stuff = ten_things.split(' ')
#定义一个列表
more_stuff = ["Day","Night","Song","Frisbee","Corn","Banana","Girl","Boy"]
#打印列表
print stuff
#循环,当列表元素个数不等于10
while len(stuff) != 10:
#删除列表最后一个元素,并返回
next_one = more_stuff.pop()
print "Adding: ", next_one
#将删除的元素添加到另一个列表的末尾
stuff.append(next_one)
print "There are %d items now." % len(stuff)
print "There we go: ", stuff
print "Let's do some things with stuff."
#打印列表的第2个元素
print stuff[1]
#打印列表最后一个元素
print stuff[-1]
#删除列表最后一个元素
print stuff.pop()
#用空格字符联接列表中的各个元素
print ' '.join(stuff)
#用井号联接列表的第4和第5个元素
print '#'.join(stuff[3:5])
习题 40: 字典, 可爱的字典
这是最有用的容器:字典(dictionary)。
Python 将这种数据类型叫做 “dict”,有的语言里它的名称是 “hash”。