一、变量和简单数据类型
变量名只能包含字母、数字、下划线,不能以数字打头,使用小写字母。
字符串:可以使用单引号或双引号
name = "ada lovelace"
print(name.title())
方法 title() 将每个单词的首字母都改为大写
使用加号(+)来连接字符串
方法 rstrip() 删除字符串末尾空白
方法 lstrip() 删除字符串开头的空白
方法 strip() 删除字符串两端的空白
函数str(),将非字符串值表示为字符串
注释
在Python中,注释用井号(#)标识。
列表
列表由一系列按特定顺序排列的元素组成。
在Python中,用方括号([])来表示列表,并用逗号来分隔其中的元素。
如:bicycles = ['trek', 'cannondale', 'redline', 'specialized']
列表是有序集合,因此要访问列表的任何元素,只需将该元素的位置或索引告诉Python
如:bicycles[0]
列表元素的位置或索引从0开始
访问最后一个列表元素提供了一种特殊语法。通过将索引指定为-1,可让Python返
回最后一个列表元素。索引-2返回倒数第二个列表元素,索引-3返回倒数第三个列表元素:
修改列表元素:bicycles[0]='trek'
列表末尾添加元素: bicycles.append('trek')
在列表中插入元素: bicycles.insert(0, 'trek')
使用方法insert()可在列表的任何位置添加新元素,需要指定新元素的索引和值。
从列表中删除元素:del bicycles[0]
使用方法pop()删除元素:pop()可删除列表末尾的元素,并让你能够接着使用它。
列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。
可以使用pop()来删除列表中任何位置的元素,只需在括号中指定要删除的元素的索引即可。
如:bicycles.pop(0)
根据值删除元素:可使用方法remove()。
如:bicycles.remove('trek')
使用方法sort()对列表进行永久性排序
倒序排列,只需向sort()方法传递参数 reverse=True
如:bicycles.sort(reverse=True)
使用函数sorted()对列表进行临时排序
反转列表元素的排列顺序,可使用方法reverse()永久性地修改列表元素的排列顺序。
reverse()不是指按字母顺序相反的顺序排列元素,而只是反转列表元素的排列顺序。
确定列表的长度:使用函数len()
for循环
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician)
for语句末尾的冒号告诉Python,下一行是循环的第一行。
在for循环中,想包含多少行代码都可以。
在代码行for magician in magicians后面,每个缩进的代码行都是循环的一部分,且将针对列表中的每个值都执行一次。
函数range() 从你指定的第一个值开始,到你指定的第二个值停止,不包含第二个值
如:for value in range(1,5):
函数range()时,还可指定步长。
如:range(2,11,2) 从2开始,然后不断地加2,直到11
函数list()将range()的结果直接转换为列表。
如:numbers = list(range(1,6))
列表解析
列表解析将for循环和创建新元素的代码合并成一行,并自动附加新元素。
如:squares = [value**2 for value in range(1,11)]
结果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
列表切片
创建切片,指定第一个元素索引和最后一个元素的索引,不包含最后一个元素
如:players[0:3] 从第1个元素输出前三个元素
如果你没有指定第一个索引,Python将自动从列表开头开始
如:print(players[:4])
切片终止于列表末尾
如:print(players[2:]) 从第3个元素到列表末尾的所有元素
负数索引返回离列表末尾相应距离的元素
print(players[-3:])
创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引([:])。
复制列表
如:my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]
friend_foods = my_foods
这种语法实际上是让Python将新变量friend_foods关联到包含在my_foods中的列表,因此这两个变量都指向同一个列表。
元组
Python将不能修改的值称为不可变的,而不可变的列表被称为元组。
元组看起来犹如列表,但使用圆括号而不是方括号来标识。
定义元组后,就可以使用索引来访问其元素,就像访问列表元素一样。
如:dimensions = (200, 50)
print(dimensions[0])
print(dimensions[1])
设置代码格式
缩进
每级缩进都使用四个空格
行长
终端窗口每行容纳79字符
注释的行长都不超过72字符
空行
用一个空行将两部分隔开
if语句
if conditional_test:
do something
如:if car == 'bmw':
print(car.upper())
else:
print(car.title())
if-elif-else 结构
如:if age < 4:
print("Your admission cost is $0.")
elif age < 18:
print("Your admission cost is $5.")
else:
print("Your admission cost is $10.")
使用多个elif 代码块
如:if age < 4:
price = 0
elif age < 18:
price = 5
elif age < 65:
price = 10
else:
price = 5
省略else 代码块
如:if age < 4:
price = 0
elif age < 18:
price = 5
elif age < 65:
price = 10
检查特定值是否包含在列表中
使用关键字in
如:'mushrooms' in requested_toppings
检查特定值是否不包含在列表中
使用关键字not in
设置if 语句的格式
建议在如==、>=和<=等比较运算符两边各添加一个空格
字典
字典是一系列键—值对
如:alien_0 = {'color': 'green', 'points': 5}
访问字典中的值
如:alien_0['color']
添加键—值对
如:alien_0['x_position'] = 0
alien_0['y_position'] = 25
修改字典中的值
alien_0['color'] = 'yellow'
删除键—值对
如:del alien_0['points']
类似对象组成的字典
如:
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
遍历字典
遍历所有的键—值对,使用方法items()
如:
user_0 = {
'username': 'efermi',
'first': 'enrico',
'last': 'fermi',
}
for key, value in user_0.items():
遍历字典中的所有键,使用方法keys()
如:for key in user_0.keys():
遍历字典时,会默认遍历所有的键,省略keys()
如:for key in user_0:
按顺序遍历字典中的所有键,使用函数sorted()
如:for key in sorted(user_0.keys()):
遍历字典中的所有值,使用方法values()
如:for value in user_0.values():
剔除重复项,可使用集合(set)
for value in set(user_0.values()):
字典列表
如:
alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}
aliens = [alien_0, alien_1, alien_2]
在字典中存储列表
在字典中存储字典
函数input()
函数input()让程序暂停运行,等待用户输入一些文本
如:input("Tell me something, and I will repeat it back to you: ")
使用int()来获取数值输入
如:
height = input("How tall are you, in inches? ")
height = int(height)
求模运算符(%)是一个很有用的工具,它将两个数相除并返回余数
while 循环
如:
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1
使用break 退出循环
在循环中使用continue
使用continue语句,返回到循环开头,并根据条件测试结果决定是否继续执行循环
函数
如:
def greet_user():
"""显示简单的问候语""" #注释:生成函数的文档
print("Hello!")
向函数传递信息
实参和形参
位置实参:按顺序传递参数
关键字实参
如:
describe_pet(animal_type='hamster', pet_name='harry')
describe_pet(pet_name='harry', animal_type='hamster')
默认值
如:
def describe_pet(pet_name, animal_type='dog'):
返回值
如:
def get_formatted_name(first_name, last_name):
"""返回整洁的姓名"""
full_name = first_name + ' ' + last_name
return full_name.title()
返回字典
传递列表
传递任意数量的实参
如:
def make_pizza(*toppings):
形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封装到这个元组中。
使用任意数量的关键字实参
如:
def build_profile(first, last, **user_info):
形参**user_info中的两个星号让Python创建一个名为user_info的空字典,并将收到的所有名称—值对都封装到这个字典中。
将函数存储在模块中
导入整个模块
如:
import pizza
导入特定的函数
from module_name import function_name
from module_name import function_0, function_1, function_2
如:
from pizza import make_pizza
使用as 给函数指定别名
from module_name import function_name as fn
如:
from pizza import make_pizza as mp
导入模块中的所有函数
如:
from pizza import *
类
创建和使用类
如:
class Dog():
"""一次模拟小狗的简单尝试"""
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")
#方法__init__(),类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线。
#形参self,每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
以self为前缀的变量都可供类中的所有方法使用,还可以通过类的任何实例来访问这些变量。
类,首字母大写
给类属性指定默认值
如:
class Car():
def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 #给属性指定默认值
修改类属性的值
继承
创建子类时,父类必须包含在当前文件中,且位于子类前面。
定义子类时,必须在括号内指定父类的名称。
如:
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year) #初始化父类的属性
重写父类的方法
导入类
Python允许你将类存储在模块中,然后在主程序中导入所需的模块。
如:from car import Car
从一个模块中导入多个类
如:from car import Car, ElectricCar
导入整个模块
如:import car
导入模块中的所有类 #不推荐使用
如:from module_name import *
文件和异常
从文件中读取数据
读取整个文件
如:
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
文件路径
如:
file_path = 'C:Usersehmatthesother_filestext_filesfilename.txt'
with open(file_path) as file_object:
逐行读取
如:
with open(filename) as file_object:
for line in file_object:
print(line)
创建一个包含文件各行内容的列表
使用关键字with时,open()返回的文件对象只在with代码块内可用。
如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中。
如:
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
使用文件的内容
写入文件
写入空文件
如:
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
# 以写入('w')模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。
写入多行
如:
with open(filename, 'w') as file_object:
file_object.write("I love programming.")
file_object.write("I love creating new games.")
附加到文件
如:
with open(filename, 'a') as file_object:
file_object.write("I also love finding meaning in large datasets.n")
file_object.write("I love creating apps that can run in a browser.n")
异常
异常是使用try-except代码块处理的。
使用try-except 代码块
如:
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
else 代码
如:
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
分析文本
方法split(),它根据一个字符串创建一个单词列表
方法split()以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。
如:
>>> title = "Alice in Wonderland"
>>> title.split()
['Alice', 'in', 'Wonderland']
失败时一声不吭
在except代码块中明确地告诉Python什么都不要做。Python有一个pass语句
如:
try:
--snip--
except FileNotFoundError:
pass
else:
--snip--
存储数据
使用json.dump()和json.load()
函数json.dump()接受两个实参:要存储的数据以及可用于存储数据的文件对象。
如:
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj)
函数json.load()将文件读取到内存中
with open(filename) as f_obj:
numbers = json.load(f_obj)
重构
将代码划分为一系列完成具体工作的函数。这样的过程被称为重构。
测试代码
单元测试和测试用例
Python标准库中的模块unittest提供了代码测试工具。
各种断言方法 Python在unittest.TestCase类中提供了很多断言方法。
如:
import unittest #导入了测试模块unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase): #单元测试必须继承unittest.TestCase类
"""测试name_function.py"""
def test_first_last_name(self): #所有以test_打头的测试方法都将自动运行
"""能够正确地处理像Janis Joplin这样的姓名吗?"""
formatted_name = get_formatted_name('janis', 'joplin')
#断言方法 调用unittest的方法assertEqual()
self.assertEqual(formatted_name, 'Janis Joplin')
unittest.main() #unittest.main()让Python运行这个文件中的测试
测试类
方法setUp()
方法setUp(),Python将先运行它,再运行各个以test_打头的方法。
如:
import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
"""针对AnonymousSurvey类的测试"""
def setUp(self): #方法setUp()
"""
创建一个调查对象和一组答案,供使用的测试方法使用
"""