这是一篇根据书本《笨方法学python3》而来的博客,希望自己能在每天抽一点时间来学习python,使自己能够前后端都能得到进步。脚踏实地,一步一步!
在开始之前,希望自己的英语能够在不断地积累与代码练习中的得到提高,以及告诫自己,无论什么事,取是能力,舍是境界。
第一个程序
练习代码:
print("Hello World!") #print("Hello Again") #print("I like typing this.") #print("This is fun.") #print("Yay! Printing.") #print("i`d much rather you 'not' .") #print('I "said" do not touch this.')
练习目的:使用python的打印方法,关于print这个方法其实有很深远的说法,待补充。
问题:由于作者希望读者能够摆脱ide的依赖,使用最原始的文本编辑器去进行python练习,所以在一开始无法运行自己编写的python程序。
解决:我们需要在我们自己写的python文件目录下执行 python3.x xxx.py才能将我们的程序运行起来。比如 lpthw/ex1.py 在编者的mac系统下就需要cd lpthw才可执行命令,运行python文件。
注释与#号
练习代码:
# A comment ,this is so you can read your program later. # Anything after the # is ignored by python print("I could have code like this.") # and the comment after is ignored # You can also use a comment to "disable" or comment out code: #print("This won't run") print("This will run.")
练习目的:对于注释的使用,优秀的代码都是简洁明了的,通过合理的注释能够帮助使用者更好的理解项目。
问题:无
tip:一个小技巧,倒着阅读代码,这样可以避免你的大脑跟着每一段代码的意思走,这样可以让你精确处理每个片段,从而更容易发现代码中的错误。这是一个很好的差错技巧。
数学与数字运算
练习代码:
print("I will now count my chickens:") print("Hens",25 + 30 / 6) print("Roosters",100 - 25 * 3 / 4) print("Now I will count the eggs:") print(3.0 + 2.0 + 1.0 - 5.0 + 4.0 % 2.0 - 1.0 / 4.0 + 6.0) print("Is it true that 3 + 2 < 5 — 7?") print(3 + 2 < 5 - 7) print("What is 3 + 2?",3 + 2) print("What is 5 - 7",5 - 7) print("Oh, that's why it's False." ) print("How about some more.") print("Is it greater",5 > -2) print("Is it greater or equal",5 >= -2) print("Is it less or equal?", 5 <= -2)
练习目的:对于python中的运算符的使用,以及对于相关运算的值的理解。
问题:类似5 > 7 这类运算的结果是什么
解决:是布尔值,正确则为true,错误为false
tips:1.在运算中%是一个求余数的运算符
2.运算的优先级,PE(M&D)(A&S),括号Parentheses,指数Exponents,除Division,加Addition,减Subtraction
变量与命名
练习代码:
cars = 100 space_in_a_car = 4.0 drivers = 30 passengers = 90 cars_not_driven = cars - drivers cars_driven = drivers carpool_capacity = cars_driven * space_in_a_car average_passengers_per_car = passengers / cars_driven print("There are",cars,"cars available.") print("There are only",drivers,"drivers avaliable.") print("There will be",cars_not_driven,"empty cars today.") print("We can transport",carpool_capacity,"people today.") print("We have",passengers,"to carpool today.") print("We have to put about",average_passengers_per_car,"in each car.")
执行结果:
练习目的:巩固打印,了解对于变量的命名是对程序很重要的一部分。
问题:无
tips:
1.在使用运算符号时,使符号左右空格,便于代码阅读。
2.=是赋值,==是我们日常的等于
3.学好英语对我们的编程有巨大的作用,目前来看,比如命名。
更多的变量与打印
练习代码:
my_name = 'Zed A. Shaw' my_age = 35 # not a lie my_height = 74 # inches my_weight = 180 # lbs my_eyes = 'blue' my_teeth = 'White' my_hair = 'Brown' print(f"Let's talk about {my_name}.") print(f"He's {my_height} inches tall.") print(f"He's {my_weight} pounds heavy") print("Actually that's not too heavy.") print(f"He's got {my_eyes} eyes and {my_hair} hair.") print(f"His teeth are usually {my_teeth} depending on the coffee.") # this line is tricky, try to get it exactly right total = my_age + my_height + my_weight print(f"If I add {my_age},{my_height},and {my_weight} I got {total}.")
练习目的:对打印的理解加深,以及合理的变量名对程序很重要。
问题:无
tips:这里的打印可以以f....{}的形式进行插值。
习题6-字符传与文本
练习代码:
type_of_people = 10 # 定义人数 x = f"There are {type_of_people} types of people." #定义这里有10个人,并且是插值的方式 binary = "binary" # 定义binary变量 do_not = "don't" y = f"Those who know {binary} and those who {do_not}." print(x) print(y) print(f"I said :{x}") print(f"I also said '{y}'") hilarious = False joke_evaluation = "Isn't that joke so funny ?! {}" print(joke_evaluation.format(hilarious)) w = "This is the left side of ..." e = "a string with a right side." print(w + e)
练习目的:继续使用打印,以及forma的插值使用。
问题:无
tips:对于代码的调试,重中之重就是不断的print print print
习题7-更多打印
练习代码:
print("Mary had a little lamb.") print("Its fleece was white as {}.".format('snow')) print("And everywhere that Mary went.") print("." * 10) # what'd that do ? end1 = "C" end2 = "h" end3 = "e" end4 = "e" end5 = "s" end6 = "e" end7 = "B" end8 = "u" end9 = "r" end10 = "g" end11 = "e" end12 = "r" # watch that comma at the end. try removing it to see what happens print(end1+end2+end3+end4+end5+end6,end=' ') #打印cheese 并且加空格end=' ' 赋值并且打印 print(end7+end8+end9+end10+end11+end12)
练习目的:继续理解打印的规则
问题:无
tips:打印的时候可以赋值再打印,就像倒数第二行代码显示的一样。
习题8-打印,打印
练习代码:
formatter = "{} {} {} {}" print(formatter.format(1,2,3,4)) print(formatter.format("one","two","three","four")) print(formatter.format(True,False,True,False)) print(formatter.format(formatter,formatter,formatter,formatter)) print(formatter.format( "Try your", "Own text here", "Maybe a poem", "Or a song about fear" ))
练习目的:学习format的使用
问题:无
tips:这里使用了函数,其实不只是我们自己定义的是函数,function()就是函数,带括号就是一种调用的方式。
习题9-打印,打印,打印
练习代码:
# Here's some new strange stuff ,remember type it exactly. days = "Mon Tue Wed Thu Fri Sat Sun" months = "Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug" print("Here are the days:",days) print("Here are the months:",months) print(""" There's something going on here. With the three double-quotes. We'll be able to type as much as we like. Even 4 lines if we want, or 5, or 6. """)
练习目的:继续体会打印的用处,初步了解转义符号以及多行打印的用处。
问题:无
tips:人世事艰难,你能熬过多少至暗时刻,就能走多远。
习题10-那是什么
练习代码:
tabby_cat = "\tI'm tabbed in." persian_cat = "I'm split\non a line." backslash_cat = "I'm \\ a \\ cat" fat_cat = """ I'll do a list: \t* Cat food \t* Fishies \t* Catnip\n\t* Grass """ print(tabby_cat) print(persian_cat) print(backslash_cat) print(fat_cat)
练习目的:对于转义字符的学习
问题:无
tips:这里分享部分转义序列(硬核分享),转义字符的斜杠是\,不要记反了哦
习题11-提问
练习代码:
print("How old are you?",end=' ') age = input() print("How tall are you?",end=' ') height = input() print("How much do you weight?",end='') weight = input() print(f"So, you're {age} old, {height} tall and {weight} heavy")
练习目的:input的使用,用于用户输入,并赋值的过程
问题:无
tips:暂无。类似高级用法x = int(input())
习题15-读取文件
练习代码:注释如图
from sys import argv # 从sys的包中导入argv模块 script, filename = argv # 为运行命令行时需要输入文件名 txt = open(filename) # 相当于是文件句柄with open() as f的f print(f"Here's your file {filename}:") # 打印文件名字 print(txt.read()) # 打印文件内容 print("Type the filename again:") # 文件提示 file_again = input("> ") # 再次打开文件 txt_again = open(file_again) # 同第六行代码 print(txt_again.read()) # 继续打印
需要注意的点:
问:为什么打开两次文件不会报错?
答:因为在Python中不会限制让你打开一次文件,允许多次打印。但是关闭文件也是必须的。
16-读写文件
练习代码:
from sys import argv script, filename = argv print(f"We're going to erase {filename}.") print("If you don't want that, hit CTRL-C (^C).") print("If you do want that, hit RETURN.") input("?") print("Opening the file...") target = open(filename, 'w') print("Truncating the file. Goodbye!") target.truncate() print("Now I'm going to ask you for three lines.") line1 = input("line 1: ") line2 = input("line 2: ") line3 = input("line 3: ") print("I'm going to write these to the file.") target.write(line1) target.write("\n") target.write(line2) target.write("\n") target.write(line3) target.write("\n") print("And finally, we close it.") target.close()
需要注意的知识点:
1.close:关闭文件。与编辑器中的“文件” -> “保存” 是一个意思。
2.read: 读取文件的内容。可以将结果赋给一个变量。
3.readline: 只读取文本文件中的一行。
4.truncate:清空文件,小心使用该命令。
5.write('stuff'): 将"stuff"写入文件
6.seek(0): 将读写位置移动到开头
tips:
open的默认打开模式为r,是只读模式
习题17-更多文件操作
from sys import argv from os.path import exists script, from_file, to_file = argv print(f"Copying from {from_file} to {to_file}") in_file = open(from_file).read() print(f"The input file is {len(in_file)} bytes long") print(f"Does the output file exist?{exists(to_file)}") print("Ready, hit RETURN to continue, CTRL-C to abort.") input() out_file = open(to_file, 'w') out_file.write(in_file) print("Alright, all done.") out_file.close() # in_file.close()
知识点:
1.exists 以文件名作为参数,文件存在返回true,不存在返回false
2.书本上存在部分linux指令,后期需要学习
3.read()一旦执行,会将文件关闭,所以不用自己去关闭文件。
4.打开文件之后为什么要关闭?减少资源消耗、关闭才会同步到磁盘。
19-命名、变量、代码和函数
''' 函数的功能 1.他们给代码段命名,就像变量给字符串和数值命名一样 2.它们可以接收参数,和脚本argv接收参数一样 ''' # this one is like your scripts with argv def print_two(*args): agr1, agr2 = args print(f"arg1: {agr1}, arg2: {agr2}") # ok, that *args is actually pointless, we can just do this def print_two_again(arg1,arg2): print(f"arg1: {arg1}, arg2: {arg2}") # this just take one argument def print_one(arg1): print(f"arg1:{arg1}") # this one take no argument def print_none(): print("I got nothin'.") print_two("Zed","Shaw") print_two_again("Zed","Shaw") print_one("First!") print_none()
知识点:
1.函数命名的规则
与变量名相同,只要以字母、下划线以及数字组成的,而不是以关键字开头的即可(也不能是常用的关键字)
2.*args中的*是什么意思
告诉python接收所有参数,放到args的列表当中去,在函数中取出来,解包,继续使用。
19-函数与变量
话不多说,代码先行:
def cheese_and_crackers(cheese_count, boxes_of_crackers): print(f"You have {cheese_count} cheeses!") print(f"You have {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 function numbers directly:") cheese_and_crackers(20, 30) print("OR, we can use variables from our script:") amount_of_cheese = 10 amount_of_crackers = 50 cheese_and_crackers(amount_of_cheese,amount_of_crackers) print("We can even do math inside too:") cheese_and_crackers(10 + 20, 5 + 6) print("And we can combine the two, variables and math:") cheese_and_crackers(amount_of_cheese + 100, amount_of_crackers + 1000) # 调用该方法,通过变量加数字的形式
本节主要是学习函数的不同的使用方式,分别为常量调用、变量调用、两者相加的调用、含有计算的调用。
需要注意的是:函数的中的参数,当实际参数传入函数之后,函数会为这些变量创建一些临时的版本,等函数结束之后销毁。
20-函数与文件
from sys import argv #从sys库里面导入argv包 script, input_file = argv def print_all(f): print(f.read()) def rewind(f): f.seek(0) def print_a_line(line_count, f): print(line_count,f.readline()) current_file = open(input_file) print("First let's print the whole file:\n") print_all(current_file) # 调用函数,打印文件所有内容 print("Now let's rewind, kind of like a tape.") rewind(current_file) #将光标重置在文件的第一行 print("Let's print three lines:") current_line = 1 print_a_line(current_line,current_file) current_line = current_line + 1 print_a_line(current_line, current_file) current_line = current_line + 1 # 函数页数加一 print_a_line(current_line, current_file) # 调用print_a_line函数
知识点:
1.文件句柄可以理解为针头,读取文件的使用类似固体磁盘去读取
2.readline()是扫描文件里面的\n来找到每一行的终止的。
21-函数可以返回某些东西
def add(a, b): print(f"ADDING {a} + {b}") return a + b def subtract(a, b): print(f"SUBTRACTING {a} - {b}") return a - b def multiply(a, b): print(f"MULTIPLYING {a} * {b}") return a * b def divide(a, b): print(f"DIVIDING {a} / {b}") return a / b print("Let's do some math with just functions!") age = add(30, 5) height = subtract(78, 4) weight = multiply(90, 2) iq = divide(100, 2) print(f"Age: {age}, Height: {height}, Weight: {weight}, IQ: {iq}") # A puzzle for the extra credit, type it in anyway. print("Here is a puzzle.") what = add(age,subtract(height,multiply(weight,divide(iq,2)))) print("That becomes:",what,"Can you do it by hand?")
函数中可以通过return,将我们在函数中处理的结果返回出来,比如一个加法的函数,我们的结果可以使用x = add()的方式获取,从而进行其他的操作。
25-通过终端导入脚本进行测试
def break_words(stuff): """This function will break up words for us.""" words = stuff.split(' ') return words def sort_words(words): """Sorts the words.""" return sorted(words) def print_first_word(words): """Prints the first word after popping it off.""" word = words.pop(0) print(word) def print_last_word(words): """Prints the last word after popping it off""" word = words.pop(-1) print(word) def sort_sentence(sentence): """Take in a full sentence and returns the sorted words.""" words = break_words(sentence) return sort_words(words) def print_first_and_last(sentence): """Prints the first and last words of the sentence.""" words = break_words(sentence) print_first_word(words) print_last_word(words) def print_first_and_last_sorted(sentence): """Sorts the words then prints the first and last one.""" words = sort_sentence(sentence) print_first_word(words) print_last_word(words)
终端操作如下:
>>> import ex25 >>> sentence = "All good things come to those who wait" >>> words = ex25.break_words(sentence) >>> words ['All', 'good', 'things', 'come', 'to', 'those', 'who', 'wait'] >>> sorted_words = ex25.sort_words(words) >>> sorted_words ['All', 'come', 'good', 'things', 'those', 'to', 'wait', 'who'] >>> ex25.print_first_word(words) All >>> ex25.print_last_word(words) wait >>> words ['good', 'things', 'come', 'to', 'those', 'who'] >>> ex25.print_first_word(sorted_words) All >>> ex25.print_last_word(sorted_words) who >>> sorted_words ['come', 'good', 'things', 'those', 'to', 'wait'] >>> ex25.print_first_and_last(sentence) All wait >>> ex25.print_first_and_last_sorted(sentence) All who >>>
要点:通过终端能够快速的测试我们的代码,而且不用创建新的文件,某种程度来说较为便利。
30-if
- if为代码创建了分支,符合条件的执行,不符合条件的跳过
- 多个elif为true时,只执行第一个为true的代码块
if语句的规则
- 每一条if语句必须包含一个else.
- 如果这个else永远不应该被执行到,因为它本身没有任何意义,那你必须在else语句后面使用一个叫die函数,让它打印出出错消息并且"死"给你看。
- if 语句嵌套不要超过两层,最好尽量保持只有一层。
- 将if 语句当做段落来对待,其中的每一个if、else好和elif组合就和每一个段落的句子组合一样。这种组合最前面和最后面以一个空行区分。
- 布尔测试最好用计算好的运算结果进行判断。