以下均为Python 3.0版本以上内容,部分内容在Python 2.7有差异
第七章 用户输入和while循环
1. 用户输入函数 input()
该函数将输入的内容全部理解为字符串
使用示例:message=input("提示字符串")
实例: name=input("Please enter your name :")
如果要用的是整形变量,则应该转换:
age = input("Your age :")
# 如果没有这步转换,会报错,因为无法拿字符串与数值比较
age=int(age)
if age>= 18 :
print("Yes!")
else:
print("No!")
2.求模运算符 % 取整除 //
# // 是向下取整 ; % 运算最常见的是判断奇偶性
4%3 -> 1 4//3 -> 1 -9 // 2 -> -5
5%3 -> 2 5//3 -> 1
6%3 -> 0 6//3 -> 2
3.while循环
# 使用模板 执行语句块可搭配if语句使用
while 布尔语句或变量 :
执行语句块
break 跳出循环 ,continue 立即进入下一次循环(忽略continue之后的代码)
当进入死循环时,可按ctrl+C或关闭终端窗口
#删除列表中所有同名元素
nums=['1','1','2','0','2','3']
while '2' in nums:
nums.remove('2')
#输入存储到字典
1 people={}2 goon=True3 whilegoon :4 name=input("Please enter your name :")5 age=input("Please enter your age :")6
7 #存储
8 people[name]=age9
10 response=input("continue?(Yes/No)")11 if response == 'No':
# break 也行12 goon=False13
14 print (people)
注意:上面的age不用转换,转换也可以,因为键值对中的值可以是字符串,可以是整形,也可以是其他类型
第八章 函数
1.定义函数
所谓函数,在我看来就是一个解决相应问题的盒子。
形参与实参:形参就是函数解决问题所用到的实参的形容名,实参就是你要传给函数的输入数据。
只不过一般形参的取名都是由实际意义的,这样比较好理解函数用途以及理清传入的实参是什么。
模板与实例
def 函数名(形参): def greet_user(name):
"""函数描述文档字符串""" """问候用户"""
函数语句块 message="Hello ! "+name+" !"
print(message)
当函数有多个参数时,传递实参有两种方式:
def describe_pet(pet_name,pet_color):
a.位置实参 :实参的传入顺序与形参完全一致。
describe_pet("xiaobai","white")
b.关键字实参 :直接指定形参传入对应实参,此时顺序可任意
describe_pet(pet_color="white",pet_name="xiaobai")
定义函数时,可以给某些参数给定默认值
# 给定了默认值的参数要放到未指定的参数后面,这样Python才能正确解读所有参数。
def describe_pet(pet_color,pet_name='xiaobai'):
注意:默认值的等号两把不要有空格。
调用: describe_pet('white')
2.函数返回值
函数可以无返回值,也可以有返回值,且返回值可以是值、字符串、列表、字典等。
函数中用 return 关键字返回想要的值。
书上使用实例:
1 defbuild_person(first_name,last_name):2
3 """人名字典"""
4
5 person={'first':first_name,'last':last_name}6
7 returnperson8
9 musician=build_person('jimi','hendrix')10
11 print(musician)
3.传递列表
书上例子
1 defgreet_users(names):2
3 """问候列表中所有用户"""
4
5 for name innames:6
7 msg="Hello,"+name.title()+"!"
8 print(msg)9 usernames=[’bob,'mary','jack']10
11 greet_users(usernames)
注意:上述例子未对列表进行修改,但是这样传递列表,对列表的操作是可永久性的(会保存)。
如果不想修改列表内容,那么传递列表时应该传递列表的副本,如 greet_users(usernames[:])
有的时候,参数的数量我们并不知晓:
任意数量参数def people_of_late(class,*name): 放参数列表最后
上述情况也可以用一个列表来实现。
有时候,参数的数量,甚至类型我们都无法预知:做成多个键值对(字典参数)
def build_profile(first,last,**user_info):
1 def build_profile(first,last,**user_info):2
3 """创建个人档案"""
4
5 profile={}6
7 profile['first_name']=first8
9 profile['last_name']=last10
11 for key,value inuser_info.items():12
13 profile[key]=value14
15 returnprofile16
17 user_profile=build_profile('bob','smith',location='shanghai',field='art')18
19 print(user_profile)
4.模块
所谓模块,就是已经写好了的库函数文件,包含多个可用函数。
导入模块:import 模块名
improt turtle # turtle 是一个绘图库
使用该库文件中的函数则是用句点表示法 : turtle.pendown() 放下画笔
导入模块中的某些函数: from turtle import penup,pendown
import turtle as tl #给库文件取别名 tl.pendown()
from turtle import penup as pup #给函数取别名 使用的话直接 pup()
from turtle import * # 不推荐这样写,这样可以把所有的库函数都导入进来,不需要使用句点调用。
# 但是可能会和你文件中定义的函数冲突。
第九章 类
1.创建和使用类
类的定义:
class Dog():
classDog():"""一个简单的狗类实例"""
def_init_(self,name,age):"""初始化属性name、age"""self.name=name
self.age=age
self.color="black"defsit(self):"""坐下动作"""
print(self.name.title()+"is now sitting.")defroll_over(self):"""打滚动作"""
print("self.name.title()+" rolled over!")
a.所有函数都有self参数(实例化时不需要传递),且要放在参数列表最前,代表实例本身,
同时也代表这个函数是类里的。 类似于java/c 中的this
b.初始化函数_init_()除self外,其他参数均为创建实例所要信息,大多数是类的属性。
c.初始化函数中可以指定某属性的初始值,指定后创建实例时不需要传入该属性的实参。
创建实例并访问其属性和函数举例:
dog_1=Dog("xiaobai",6)
print(dog_1.name)
dog_1.sit()
若是要修改属性,可以直接赋值修改,也可以写一个函数来修改(修改器),
写函数的话可以给修改加很多操作限制,比方说不能比原来值低。
2.继承
先定义一个父类,再用子类继承父类。
要点:
1.定义子类时,在参数中指定父类名(可以有多个,在括号内用逗号隔开)。
2.创建子类实例时,先要给父类的所有属性赋值。
3.创建子类时,父类必须包含在当前文件中,且位于子类前面。
1 classFather:2 def __init__(self, name, age):3 self.name =name4 self.age =age5 print("创建父类")6
7 defspeak(self):8 print("父类speak")9
10 classSon(Father):11
12 def __init__(self, name, age):13 super().__init__(name, age)14 self.tooth = 4
15 print("创建子类")16
17 defspeak(self):18 print("子类speak")19
20 son_one = Son("bob", 1)
21 son_one.speak()
上述程序运行后,控制台输出为:
创建父类
创建子类
说明:a.第一行Father后面的括号可加可不加,书上有。在python 3.9.0和 python charm 中,此处提示多余的括号。
b.super()函数表示调用父类(超类)的函数。上面子类的初始化函数是显式地调用了父类的初始化函数,这样可以添加自己的属性。
事实上,子类中没有重写_init_函数时,创建子类实例会默认先调用父类的_init_函数,使得子类拥有与父类的属性和方法。
如果子类重写了_init_函数,那么子类创建时是直接执行子类的初始化函数,不会调用父类的_init_函数。
c.如果将上面子类的_init_函数注释掉,那么控制台只输出 "创建父类" 。
d.上面子类添加了特有属性牙齿(14行),先把父类的属性都赋值好,再添加自己特有的属性。
e.(17、18行)子类重写了父类的方法,调用子类的speak方法输出为 “子类speak”
f. 如果我们在前面定义了一个tooth类,那么子类的tooth属性就可以是一个tooth类的实例(等号右边换成tooth类的构造函数)。
3.导入类
与导入函数的方法完全一样!
将上面单继承的代码保存到family.py文件中,然后在新文件中导入其中的类:
导入类: from family(文件名) import Father(类名1),Son(类名2) ……
这样导入类后,可以直接使用类的构造方法: father=Father('bob',30)
导入整个类模块: import family
这样导入后,使用类的构造方法要用句点表示法: father=famuily.Father('bob',30)
(不推荐)导入模块内所有类 from family import * :等同于代码完全复制粘贴过来
这样导入后可以直接使用,但是可能会导致冲突。
4.类编码风格
类名:驼峰命名法,每个单词首字母大写。 GoodFather
实例名和模块名:全小写,单词用下划线分隔。 my_car
第十章 文件和异常
1.从文件中读取数据
1 with open('file.txt') as file_object2 contents =file_object.read()3 print(contents)
说明:a. with 关键字 :在不需要访问文件后将其关闭,不用我们手动关闭,即调用 close()函数。
b. 文件打开函数 open() 参数为 文件路径(定位到文件名),上面直接使用文件名代表该文件存储于当前编辑的 .py文件所在的目录下。
c. as 关键字 将打开的文件内容 存到 file_object 这个对象中,之后对文件的操作就是对这个对象进行操作。
d. read()函数将文件内容以字符串的形式读出,读到文件末尾时,会返回一个空行。
open函数的文件路径参数还可以使用 绝对路径,即从盘符开始,定位到目标文件。如:E:\Python_pj\PYproject_2\file.txt
使用 相对路径,只是可以省略 E:\Python_pj\PYproject_2 ,因为这是当前.py文件所在的目录。
注意:路径中使用的是反斜杠"\" 而不是斜杠"/"
读取文件实例二
1 filename='myfile'
2
3 #读取后直接使用(with 代码块中使用)
4 with open(filename) as my_file5 #逐行读取
6 for line inmy_file7 print(line)8 #这样读取每行末尾都有一个换行符用
9 #消除空白行用 line.rstrip()
10
11
12 #读取内容存储到对象中,可在with代码块外使用
13 with open(filename) as my_file14 #存到列表中,每个元素是一行内容
15 lines =my_file.readlines()16
17 for line inlines:18 print(line.rstrip())
2.将数据写入文件
1 filename = 'myfile.txt'
2
3 with open(filename,'w') as file_object4 file_object.write("Python programming.")
函数open() 有第二个参数,表示模式。
w 写入模式 ;r 只读模式 ; a 附加模式 ; r+ 读写模式。 缺省默认只读模式。
Python只会以字符串的形式将内容写入文件,其他类型要先转换成字符串才能写入。 str() 函数可以转为字符串。
注意:如果写入的文件不存在,就会自动新建。 如果已经存在,python会在返回文件对象前清空该文件。
也就是说写入模式是覆盖原文件。
1 #附加模式写入多行数据
2 #写入的内容直接添加在文件的末尾
3
4 with open(filename,'a') as file_obj5 #要加 换行符\n 否则字符串都在同一行
6 file_obj.write("I love Python.\n")7 file_obj.write("I love programming.\n")
3.异常
如果觉得某个过程会出现异常,就使用 try-except(-else)包含该过程的代码。
1 #异常实例
2 print("Give me two numbers a and b, I will return a/b")3
4 first_num =input("first number:")5 second_num =input("second number:")6
7 #除数可能为零
8 try:9 answer=int(first_num/second_num)10
11 #除数为零异常
12 exceptZeroDivisionError:13 print("You can't divide by 0!")14
15 #else 表示无异常则继续执行的代码
16 #本部分是可选的,但一般都有,因为要继续执行程序
17 else:18 print(answer)
如果不处理异常。程序就会崩溃,控制台返回traceback。
这样可以处理找不到文件(FileNotFoundError)等异常了。
书上还用举了一个数小说文本文件中有多少个单词的例子,其大致思路是:
编写一个数单词的函数,这个函数中,处理打开文件时找不到文件的异常,
找到了就用read()函数得到所有字符串存在contents,调用contenes.split()函数
将字符串按空格分隔开,存在列表中,列表的长度就是词数。
接着把要数的文件名放在一个列表中遍历,每个调用上面的函数就完成了。
4.存储数据
使用模块json来存储数据,这样可以在不同环境下交互数据,因为json数据是通用的,可用于多种语言中。
存储数据 json.dump(数据对象,文件对象) ; 取数据 数据对象=json.load(文件对象)
1 #用json文件存数据
2
3 importjson4
5 numbers=[2,34,5,6,7,9,33,56]6
7 filename='numbers,json'
8 with open(filename,'w') as f_obj9 #json存储函数
10 #参数依次为 要存储的数据对象,文件对象
11 json.dump(numbers,f_obj)12
13 #用json文件取数据
14 #将上面存储语句换成下面这句
15 numbers=json.load(f_obj)
5.重构
重构就是你自己优化你的项目代码结构,使得代码层次分明,功能函数汇总与模块等等
一个函数,要么返回预期值,要么返回None.
第十一章 测试代码
1.测试模块
Python有专门用来做测试的模块 unittest。
当你要进行测试时,专门写测试类,测试类要继承 unittest.TestCase类,这样Python才知道如何运行你写的测试。
感觉这部分内容需要在项目中实践才能有深刻的印象,单看书本上的例子体会不深,我感觉和自己写(不用unittest类)差不多?
这里就先跳过这部分内容。