得来全不费功夫,绝知此事要躬行!
第一章 起步
好饭不怕晚。
下载网址www.org.com,根据电脑系统下载即可。安装好Python,继续下载Sublime Text文本编辑器。
装好软件,打开新世界。
第二章 变量和简单数据类型
2.1变量
变量名只能包含字母,数字,下划线,不能以数字打头,不能包含空格,尽量简单且具有描述性。
#print(message),message即为变量。
2.2使用变量名时避免发生命名错误
像这样:
print(message)✅ print(mesage)
程序无法运行时,解释器将提供一个traceback。指出解释器尝试运行代码时,在什么地方陷入了困境。很多编程错误都很简单,只是在程序的某一行输错一个字符。
2.3字符串
字符串时一系列字符,用括号括起的都是字符串,可以是单引号和双引号。
2.3.1使用方法修改字符串大小写
name后面的句点(.),让python对变量name执行方法title()指定的操作。title()将每个单词首字母大写
name=“alice" Print(name.title())
2.3.2 在字符串中使用变量
要在字符串中插入变量的值,可在前引号前加上字母f,再将要插入的变量放在花括号内。这种字符串名为f字符串。
First_name=“sun" Last_name=“wu kong" Full_name=f”{first_name}{last_name}" Print(full_name) Print(f”hello,{full_name.title()}")
2.3.3 添加空白
在编程中, 空白泛指非打印字符,如空格,制表符或换行符。添加制表符:\t;添加换行符:\n。
2.3.4 删除空白
空白很重要,经常需要比较两个字符串是否相同。一个重要应用,在用户登陆网站时检查用户名。
删除末尾空白:rstrip(); 删除开头空白:lstrip; 删除两边空白:strip。
2.4 数
Python 可对整数(int)执行+,-,*,/ 运算。带小数点的数称为浮点数(float)。
第三章 列表简介
3.1 列表
列表由一系列按特定顺序排列的元素组成。列表通常包含多个元素,因此给列表指定一个表示复数的名称。在Python中,用方括号[]表示列表,并用逗号分隔其中的元素。
3.1.1 访问列表元素
fruits=[’apple’,’pear’,’banana'] Print(fruits[0]). #索引
3.1.2 索引从0开始
列表第一个元素索引为0,最后一个元素为-1。使用列表中的值可以使用f字符串。
fruits=[‘apple’,’pear’,’banana’] Print(f”my favorite fruit is {fruits[0]}.")
3.2 修改,添加,删除列表元素
在列表中修改元素,可指定列表名和要修改元素的索引,再指定该元素的新值。
fruits=[‘apple’,’pear’,’banana'] fruits[0]=‘watermelon'
在列表中增加元素,可使用append(),将元素增加至末尾;或者使用insert,将元素插入至任意位置。
fruits.append(’strewbary') Fruits.insert(0,’Hami melon')
在列表中删除元素,可使用del, pop(), remove()语句。
del fruits[1] #默认末尾元素 favorite=fruits.pop(0) #默认弹出末尾元素,可指定任意元素,删除后可继续使用 Too_sweet=‘watermelon' fruits.remove(too_sweet)
3.3 列表排序
在列表排序中,sort()使列表按字母正序排列;加reverse条件,字母倒序排列。永久改变。
cars=[‘audi’,’bmw’,’ferrari'] cars.sort() cars.sort(reverse=True)
列表排序还可使用sorted,做临时改变。
Print(sorted(cars))
反转列表(不按字母),使用reverse,永久改变,恢复需再次反转。
cars.reverse() print(cars)
确定列表长度,使用len()。
print(Len(cars))
第四章 操作列表
4.1 遍历整个列表
遍历列表的所有元素,需要对表中每个元素执行相同操作,可使用for循环。使用单数和复数名称,可帮助判断代码处理是单个列表元素或整个列表。
characters=[‘鲁智深’,’杨志’,'武松'] for character in characters: Print(character)
执行更多操作,使用f字符串引用列表元素。
characters=[‘鲁智深’,’杨志’,'武松'] for character in characters: Print(f”{character}大侠,相见恨晚!")
for 循环,缩进代码循环,未缩进代码不循环。
invites=[’Steve jobs’,’lill gates’,’elon musk',] for invite in invites: Print(f”{invite} professor coming!") Print(“let us welcome!")
4.2 创建数值列表
创建数值列表,range()函数可生成任何需要的数集。指定两个参数,在第二个停止;指定一个参数,从0开始,到指定数停止。
for value in range(1,4): Print(value) for value in range(3) Print(value)
用range()创建数字列表。
numbers=list(range(9)) Print(numbers)
squares=[] for value in range(4): square=value**2 Squares.append(square) Print(squares)
列表统计运算。
digits=list(range(10)) print(digits) print(min(digit)) print(max(digit)) print(sum(digit))
用步长创建列表。
Odd_numbers=list(range(1,11,2)) #用步长创建奇数列表 Print(odd_numbers)
用列表解析创建,列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。
odd_numbers=[(2*value-1) for value in range(1,6)] Print(odd_numbers)
4.3 使用列表的一部分:切片
创建切片,可指定要使用的第一个元素和最后一个元素的索引。与range()函数一样,在到达第二个索引之前的元素后停止。
invests=[‘house’,’bond’,’stock'] Print(invest[:2]) #从开头索引 Print(invest[2:]) #索引到结尾 Print(invest[-1:]) #负数从末尾倒数开始索引
遍历切片。
for invest in invest[:2] Print(invest)
复制切片,使用切片创建副本。
My_wants=[‘lovers’,’cars’,’health'] His_wants=my_wants[:]
4.4 元组
列表适合存储可能变化的数据集。列表是可修改的有时候创建不可修改的元素,可以用元组。元组使用圆括号表示。元组由逗号表识,如果定义一个只包含一个元素的元组,必须在这个元素后加逗号。
元组不能修改元素,可以给存储元组的变量
第五章 if 语句
if 语句处理特殊情形
cars=[‘audi’,’bens’,’bmw',] for car in cars: if car ==‘bmw' Print(car.upper()) Else: Print(car.title())
==判断两个值相等,!=判断两个值不相等。
条件语句中可包含各种数学比较,小于,小于等于,大于,大于等于。
检查多个条件可使用and 和or。
检查特定值是否包含在列表中,可使用 in 和 not in。
使用if 语句,满足条件执行,否则不执行;使用if-else语句,总会执行其中一个操作。
#If-else 结构 age=19 if age > 19: Print(“you are old enough to vote.") Else: Print(“you are not old enough to vote")
#if-elif-else 结构 age=18 If age <4: price=0 Elif 4 < = age <18: price=25 Else: price=40 Print(f“you should pay{price} dollars.")
#测试多个条件,执行多个代码块,可只用if语句,而不用elif,else。 wants=[‘lovers’,’cars’,’house'] If ‘lovers’ in wants: Print(“lovers is important in my life.") if ‘cars’ in wants: Print(“cars is important in my life.")
#确定列表是否为空 Requested_toppings=[] for requested_topping in requested_toppings: Print(“add {requested_topping}") Print(“finished your pizza.") Else: Print(“\nyou want a plain pizza?")
#使用多列表 Odd_numbers=list(range(1,11,2)) #10以内奇数 even_numbers=list(range(0,11,2) #10以内偶数 for even_number in even_numbers: If even_number in odd_numbers: Print(f“{even_number} is odd. ") Else: Print(f”{even_number} is even.")
第六章 字典
6.1 字典
字典是一系列键值对。每个键与一个值相关联,可以使用键来访问相关的值。与键相关的值可以是数,字符串,列表,乃至字典。字典用花括号{ }表示,键值对是两个相关联的值,键和值之间用冒号分隔,字典中储存任意多键值对。
Alien_0={‘color’:’green’,’point’:5}
6.2 使用字典
访问字典中的值,可依次指定字典名和放在字典中的键。
Alien_0={‘color’:’green’,’point’:5} Print(alien_0[‘color'])
字典是一种动态结构,可随时添加键值对。添加键值对时,可依次指定字典名,用方括号括起来键和相关的值。
alien_0[’speed’]=’slow'
创建空字典,再分行添加键值对。
Alien_0={} Alien_0[‘color’]=‘red' Alien_0[‘point’]=100
修改字典中的值,依次指定字典名,用方括号括起来的键,以及与该键关联的新值。
Alien_0[‘color’]=‘blue'
#机器人位移例子 Alien_0={‘x_position’:0,’y_position’:0,’speed’:’slow'} if alien_0[’speed’]=’slow’: increase=3 Else: increase=10 Alien[x_position] +=increase Print(alien_0)
删除键值对,可使用del,使用del语句,必须指定字典名和要删除的键。
del alien[‘color']
由类似对象组成的字典,可以用多行定义。在输入花括号后按回车键,在下一行缩进四个空格,指定第一个键值对,并在后面加一个逗号。以此类推,定义好字典,在最后一个键值对的下一行添加右花括号,缩进四个空格。
Favorite_language={ ‘alice’:’python' ‘bob’:’c' ‘dave’:’java' }
使用get()访问值,当字典中指定的键不存在,使用get(),返回一个默认值,避免引发程序错误。
Alien_0={‘color’:’red’,’speed’:’slow'} Point_value=ailen_0.get(‘point’,’no point value assigned') #如果第二个值未指定,返回none point_value=alien_0.get(‘point’,)
6.3 遍历字典
User_0={ ‘username’:’fermi’, ‘first’:’Enrico', ‘last’:’fermi’, } For key,value in user_0.items(): Print(f”keys:{key}") Print(f”values:{value}")
特定顺序遍历字典中的元素,可使用函数sorted()。
for name in sorted(user_0.keys()): Print(name)
遍历字典中的所有值,为剔除重复,可使用集合set,集合中的元素都是独一无二的。集合和字典都用花括号定义,当花括号内没有键值对时,定义的很可能是集合。
for name in set(user_0.keys()): Print(name)
6.4 嵌套
有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。
#字典存储外星人信息 alien_0={‘color’:’red’,’points’:5} alien_1={‘color’:’green’,’points’:’10'} #创建外星人列表 aliens=[alien_0,alien_1] #遍历列表中外星人 for alien in aliens: Print(alien)
符合现实的情况是,创建元素远大于三个,可以使用range()生成。
经常需要在列表中包含大量字典,其中每个字典都包含特定对象的众多信息。当列表中,所有字典结构相同时,可以遍历列表,以相同的方式处理其中每个字典。
在字典中存储列表,每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。
pizza={ ‘crust’:’’:thick, ’topping’:[‘’,’mushrooms’,’extra cheese'] }
Page_98页,改进方案调试成功,Sarah喜欢的语言单独行打印,其他人分行打印。
在字典中储存字典,多个用户的用户名作为键,用户信息作为相关值。
第七章 用户输入和while循环
7.1 函数input()
函数input()让程序停止,等待用户输入一些文本,获取用户输入后,将其赋给一个变量,方便使用。
使用input(),函数需要接受一个参数,即要向用户显示某些提示,让用户知道如何做。
使用int()可以获取数值输入,用来做数值比较。如age=int(age),height=int(height)。
处理数值信息还可以使用求模运算符%,它将两个数相除并返回余数。可用作判断奇偶数。
#人机交互程序运行时,可单独建立文件夹,储存程序,用python运行,并实现交互。
7.2 while 循环
for 循环用于针对集合中的每个元素都执行一个代码块,while循环则不断运行,直到指定的条件不满足为止。
设置退出:
定义退出值,通过检查条件,执行while循环所需要的比较,程序运行或结束。
在要求很多条件都满足才继续运行的程序中,使用标志,定义变量,判断整个程序是否处于活动状态。可以让程序在True时继续运行,在任何事件导致标志值为False时程序停止运行。
break 和continue
要立即退出while循环,不再运行循环中余下的代码,不管条件测试结果如何,可使用break语句。
要返回循环开头,并根据条件测试结果决定是否继续执行循环,可使用continue语句。
7.3 使用while 循环处理列表和字典
在遍历列表的同时进行修改,可使用while循环。通过将while循环同列表和字典结合起来,可收集,存储并组织大量输入。
在列表之间移动元素:
删除特定值的列表元素:
使用户输入信息填充字典:
第八章 函数
8.1 定义函数
函数结构使用def 告诉python要定义一个函数,并向python指出函数名,在括号内指出完成任务需要的信息,最后以冒号结束。
函数定义后的缩进体构成了函数体。(可以给函数加注释)
调用函数让python 执行函数的代码。调用函数,可依次指定函数名以及用括号括起的必要信息。
def greet_user(): """显示简单的问候语""" print("hello!") greet_user()
向函数传递信息
定义函数时,可在函数名括号内加入变量名,并在调用函数时,将信息传递给变量。变量称为形参,传递的信息称为实参。
def greet_user(username): Print(f”hello ,{username.title()}") Greet_user(‘bob') #username 形参;bob 实参。
8.2 传递实参
函数定义可能包含多个形参,函数调用也可能包含多个实参。向函数传递实参,可以使用位置实参和关键字实参。实参由变量名和值组成,还可使用列表和字典。
位置实参:基于顺序将实参与形参关联。
关键字实参:关键字实参传递给函数名称值对,直接在实参中将名称与值关联。
默认值:编写函数可给每个形参指定默认值。先列没有默认值的形参,再默认值形参。
8.3 返回值
函数可以处理一些数据,返回一个或一组值。函数返回的值称为返回值,在函数中,使用return语句将值返回到调用函数的代码行。
让实参变为可选:只需要在必要时提供额外信息,可使用默认值让实参变为可选。
返回字典:函数可返回任何类型的值,包括列表和字典等复杂结构。
使用循环和退出:加入while语句和if语句。
8.4 传递列表
向函数传递列表很有用,其中可能包含名字,数或更复杂对象。将列表传递给函数后,函数就能直接访问内容,提高处理列表的效率。
修改列表:
调用副本:
8.5 传递任意数量实参
使用*,**传递任意数量实参与键值对。必须在函数定义中将接纳任意数量实参的形参放在最后。先匹配位置实参和关键字实参,将余下的实参收集到最后一个形参中。
8.6 模块
第九章 类
面向对象编程是最有效的软件编写方法之一,对象编程中,常编写类,并基于类创建对象。编写类时,定义大类的通用行为,基于类创建的对象都自动具备这种通用行为,然后赋予每个对象独特的个性。
9.1 创建和使用类
python中,首字母大写的名称指的是类。定义中没有圆括号。
方法__init__()
类中的函数称为方法,方法中开头和末尾有两个下划线。
方法__init__包含三个形参:selfsame,age。形参self必不可少,创建Dog实例时,将自动传入实参self。每个与实例相关联的方法调用都自动传递实参self,让实例能够访问类中的属性和方法。
以self为前缀的变量可供类中的所有方法使用,可以通过类中任何实例来访问,这样可通过实例访问的变量称为属性。
根据类创建实例:
9.2 使用类和实例
类编写好,大部分时间将花在实例上,后来的一个重要任务是修改实例的属性。可以直接修改实例的属性,也可以编写方法以特定方式修改。
创建Car类。
给属性指定默认值。
修改属性的值。
9.3 继承
编写类时,可使用继承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法。原有的类称为父类,新的类称为子类。子类继承父类的所有属性和方法,同时可以定义自己的属性和方法。
子类的方法__init__
在既有类的基础上编写新类时,通常要调用父类的方法__init__()。这将初始化父类方法中定义的所有属性,从而让子类包含这些属性。
给子类定义属性和方法:
重写父类的方法:
对于父类中的方法,都可以进行重写,可在子类中定义一个与要重写的父类方法同名的方法。
将大类拆分为小类,并将小类作为大类的属性:
9.4 导入类
python允许将类存储在模块中,然后在主程序中导入所需的模块。
导入类是一种有效的编程模式,可以导入单个类;在同一模块存储多个类并导入;可以导入整个模块,也可以分别从不同模块中导入类。导入类时,可使用别名from…import…as...
9.5 python 标准库
python标准库是一组模块,可以使用标准库中的任何函数和类。
From random import randint #randint()将两个整数作为参数,随机返回一个位于两个整数之间的整数。 From random import choice #choice()将列表或元组作为参数,随机返回其中一个元素。
第十章 文件和异常
10.1 从文件中读取数据
要使用文本文件中的信息,首先要将信息读取到内存中,可以一次性读取文件全部内容,也可以每次一行的方式逐步读取。
可以使用相对文件路径打开其中的文件。相对文件路径让python到指定位置查找,该位置是相对于当前运行程序所在的目录。
还可使用绝对文件路径将准确位置告诉python,可读取系统中任何地方的文件。最简单的做法是,将数据文件储存在程序文件所在的目录,或者储存在程序文件所在目录下的一个文件夹中。
逐行读取文件内容。
创建一个包含文件各行内容的列表,并读取文件内容。
使用文件中内容。
10.2 写入文件
写入文件可保存数据,写入文件先调用open(),第一个实参为要打开的文件的名称,第二个实参为写入模式。写入模式可指定为读取模式(‘r’),写入模式(’w’),附加模式(’a’),读写模式(’r+’)。如果忽略模式实参,默认为只读模式。
10.3 异常
python使用异常的特殊对象管理程序执行期间发生的错误。每当发生错误时,python会创建异常对象。如果编写了处理该异常的代码,程序将继续运行;如果未处理,程序将显示traceback。
异常是使用try-except代码块处理的。使用try-except代码块时,即便出现异常,程序也将继续运行,显示编写的友好错误信息。
通过将可能引发错误的代码放在try-expect代码块中,可提高程序抵御错误的能力。依赖try代码块成功执行的代码都应放到else代码块中。
处理FlieNotFoundError异常。
分析文本。
使用多个文件。
静默失败。可以使用pass语句,在程序发生异常时保持静默,像什么没发生一样运行。
10.4 存储数据
模块json可以将简单的python数据结构转储到文件中,并在程序再次运行时加载文件中的数据。
使用json.dump()存储,使用json.load()读取。
保存和读取用户生成的数据。
重构
通过改进代码,将其划分为一系列完成具体工作的函数,这样的过程称为重构。重构让代码更清晰、更易于理解、更容易扩展。
第十一章 测试代码
编写测试,可确定代码面对各种输入都能按照要求的那样工作。
11.1 测试函数
学习测试,必须有要测试的代码。python提供了一种自动测试函数输出的高效方式。
单元测试和测试用例
模块unittest提供了代码测试工具。单元测试用于核实函数的某个方面没有问题。测试用例是一组单元测试,核实函数在各种情形下的行为都符合要求。良好的测试用例考虑到了函数可能收到的各种输入,包含所有情形的测试。全覆盖的测试用例包含一整套单元测试,对于大型项目,进行全覆盖测试很难。
要为函数编写测试用例,可先导入unittest和要测试的函数,再创建一个继承unittest.TestCase的类。这个类必须继承unittest.TestCase类,这样python才知道如何运行编写的测试。NameTestCase只包含一个方法,用于测试get_formatted_name()的一个方面。运行test_name_function.py时,所有以test_开头的方法都将自动运行。
self.assertEqual()断言方法:unittest类最有用的功能之一,断言方法核实得到的结果是否与期望的结果一致。
测试未通过时,不要修改测试,而应修改导致测试不能通过的代码,找出导致函数行为不符合预期的修改。
添加测试:
11.2 测试类
各种断言方法:
方法 | 用途 |
---|---|
assertEqual(a,b) | 核实a==b |
assertNotEqual(a,b) | 核实a !=b |
assertTrue(x) | 核实x为True |
assertFalse(x) | 核实x为False |
assertIn(item, list) | 核实item在list中 |
assertNotIn(item, list) | 核实item不再list中 |
测试类:
方法setUp():
方法setUp()只需要创建对象一次,就能在每个测试方法中使用。测试编写的类时,方法setUp()让测试方法编写起来更容易。
第一部分终结,go!