本文是对《Python编程:从入门到实践》的简单整理
简单变量
字符串
引号可为单引号或双引号
string.title()
首字母大写
string1+string2
字符串合并
string.rstrip()
删除末尾空白
string.lstrip
删除开头空白
string.strip()
删除两侧空白
string.split()
根据字符串创建单词列表
数字
str(num)
转换为字符串
列表
列表基础
用[]
表示,用,
分隔。可以将任何东西加入列表,其中的元素没有任何关系。
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)
打印结果为;
['trek', 'cannondale', 'redline', 'specialized']
list[index]
访问列表元素
列表索引从0开始。
list.append()
添加列表元素
list.insert(index, value)
插入新元素,指定其索引和值
list.pop()
返回列表末端元素,原列表删除末端元素
list.pop(index)
弹出指定索引的元素
list.remove(value)
根据值删除元素,只删除第一个指定值的元素
list.sort()
对列表进行永久性排序(字典序)
sorted(list)
对列表进行临时排序(字典序)
list.reverse()
反转列表
len(list)
求列表中的元素数
list[-1]
列表中的最后一个元素
操作列表
遍历列表
for element in list: #记得加冒号
operation1 #缩进语句在循环中执行
operation2 #该操作不在循环中
数值列表
for value in range(begin, end):
operation
数值仅从begin
至end-1
list(range(begin, step, end))
转换为数值列表
min(list)
求列表中最小值
max(list)
求列表中最大值
sum(list)
求列表中所有元素之和
列表解析的例子:
squares = [value**2 for value in range(1, 11)]
print(squares)
输出结果为:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
使用列表的一部分
list[begin:end]
选取列表中索引从begin
至end-1
的元素组成新的列表,若不指定第一个元素则从头开始,若不指定终止元素至最后一个元素结束。
list2=list1[:]
复制列表
元组
列表是可修改的,元组是不可修改的。
用()
表示,用,
分隔。
tuple[index]
访问元组中的元素
遍历元组与遍历列表类似。
不可修改元组内元素,但可对整个元组重新赋值。
条件语句
==
相等 !=
不等 and
和 or
或 True
真 False
假
if condition1:
operation1
elseif condition2:
operation2
else: operation3
element in list
检查特定元素是否在列表中
list
作为条件语句判断列表是否非空
字典
基本操作
字典是一系列键值对,每个键都与一个值相关联。
例子如下:
alien_0 = {'color': 'green', 'points': 5}
dictionary[key]
访问对应键的值
dictionary[newkey] = value
添加键值对
del dictionary[key]
删除对应键值对
建议将一个较大的字典放在多行中
字典的遍历
遍历所有键值对:
for key, value in dictionary:
operation
遍历所有键:
for k in dictionary.keys():
operation
遍历所有值:
fro v in diuctionary.values():
operation
字典的嵌套
字典,列表之间,字典与字典之间可以相互嵌套。
用户输入和while循环
用户输入
message=input(string)
向用户提示string,message为接收的用户输入(默认为字符串)
int(string)
将字符串转换为整数
while循环
while condition:
operation
只要用户输入的不是这个值,程序就一直运行的例子:
while message != 'quit':
message = input(prompt)
print(message)
在while循环中可以使用标志:while tag = True or False :
break
退出循环 continue
跳过该次循环
函数
函数基础
def function(para1, para2):
operation
若使用关键字实参则函数调用实参的顺序就不再重要了
function(para1=value1, para2=value2)
若输入参数少于所需参数,则函数调用形参的默认值
def function(para1, para2=default):
operation
返回值
def function(para1, para2):
operation
return value
可选参数
运用函数调用形参默认值的规则,将可选参数置于参数输入的末尾
def function(para1, para2, para3=default):
operation
return value
通过function(para1, para2)
调用
传入列表
将列表传入函数后可改变列表内容
若要禁止函数修改列表,则可传入列表的副本function(list[:])
传入任意数量的参数
使用元组
def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print(toppings)
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
形参名*toppings中的星号让Python创建一个名为toppings的空元组,并将收到的所有值都封 装到这个元组中。
打印结果为:
('pepperoni',)
('mushrooms', 'green peppers', 'extra cheese')
结合位置实参和任意数量实参
def make_pizza(size, *toppings):
"""概述要制作的比萨"""
print("\nMaking a " + str(size) +
"-inch pizza with the following toppings:")
for topping in toppings:
print("- " + topping)
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
使用字典(任意数量的关键字实参)
def build_profile(first, last, **user_info):
"""创建一个字典,其中包含我们知道的有关用户的一切"""
profile = {}
profile['first_name'] = first
profile['last_name'] = last
for key, value in user_info.items():
profile[key] = value
return profile
user_profile = build_profile('albert', 'einstein',
location='princeton',
field='physics')
print(user_profile)
形参**user_info中的两个星号让Python创建一个名为user_info的空字典,并将收到的所有名称—值对都封装到这个字典中。
打印结果为:
{'first_name': 'albert', 'last_name': 'einstein',
'location': 'princeton', 'field': 'physics'}
将函数储存在模块中
导入整个模块
仅在file.py中保留def
的函数语句块,可通过
import file
file.function(para)
调用对应的函数。
导入特定的函数
from module import function
function(para)
导入多个函数:
from module import function1,function2,function3
使用as 给函数指定别名
from module import function as func
导入模块中所有函数
from module import *
import语句中的星号让Python将模块pizza中的每个函数都复制到这个程序文件中。由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。
类
创建和使用类
一个例子如下:
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是必要的,同时必须位于其他形参的前面。Python调用这个__init__()
方法来创建实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
以self为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。self.name = name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例。像这样可通过实例访问的变量称为属性。
在Python 2.7中创建类时,需要做细微的修改,在括号内包含单词object:
class ClassName(object):
--snip--
根据类创建实例
class Dog():
--snip--
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
Python使用实参’willie’和6调用Dog类中的方法__init__()
。
方法__init__()
创建一个表示特定小狗的示例,并使用我们提供的值来设置属性nameage。
方法__init__()
并未显式地包含return语句,但Python自动返回一个表示这条小狗的实例。
可通过句点访问属性和调用方法。
使用类和实例
给属性指定默认值
class ClassName():
def __init__(self, attr1, attr2):
self.attr1 = attr1
self.attr2 = attr2
self.attr3 = default
修改属性的值
直接赋值或通过方法更新。
继承
子类的属性和方法
创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在括号内指定父类的名称。
class ClassName():
--snip--
class subclass(ClassName):
def __init__(self, attr1, attr2):
super().__init__(attr1,attr2)
self.subattr = default #初始化子类特有属性
def submethod(self): #子类特有的方法
operation
super()
是一个特殊函数,帮助Python将父类和子类关联起来。这行代码让Python调用
父类的方法__init__()
,让子类实例包含父类的所有属性。
重写父类方法
对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。
例子如下:
def ElectricCar(Car):
--snip-- #car类中有fill_gas_tank()方法
def fill_gas_tank():
"""电动汽车没有油箱"""
print("This car doesn't need a gas tank!")
将实例用作属性
当属性和方法较多时,可将类的一部分作为一个独立的类提取出来。
例子如下:
class Car():
--snip--
class Battery():
"""一次模拟电动汽车电瓶的简单尝试"""
def __init__(self, battery_size=70):
"""初始化电瓶的属性"""
self.battery_size = battery_size
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-kWh battery.")
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""
初始化父类的属性,再初始化电动汽车特有的属性
"""
super().__init__(make, model, year)
self.battery = Battery()
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
导入类
方法与导入函数类似
导入单个类
from module import class_name
也可在同一模块中存储多个类
导入多个类
from module import class1,class2
导入整个模块
import module
导入模块中的所有类
from module import *
文件和异常
从文件中读取数据
读取整个文件
一个文件读取的例子如下:
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
函数open()
接受一个参数:要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。在这个示例中,
当前运行的是file_reader.py,因此Python在file_reader.py所在的目录中查找pi_digits.txt。函数open()返回一个表示文件的对象。在这里,open('pi_digits.txt')
返回一个表示文件pi_digits.txt的对象;Python将这个对象存储在我们将在后面使用的变量中。
关键字with
在不再需要访问文件后将其关闭。
也可以调用open()
和close()
来打开和关闭文件,但这样做时,如果程序存在bug,导致close()
语句未执行,文件将不会关闭。
相比于原始文件,输出唯一不同的地方是末尾多了一个空行,因为read()
到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行。要删除多出来的空行,可在print
语句中使用rstrip()
逐行读取
filename = 'pi_digits.txt'
with open(filename) as file_object:
for line in file_object:
print(line)
创建一个包含文件各行内容的列表
filename = 'pi_digits.txt'
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.")
附加到文件
filename = 'programming.txt'
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")
打开文件时指定了实参’a’,以便将内容附加到文件末尾,而不是覆盖文件原来的内容。
异常
try: except:
语句
Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。
可以使用try: except:
语句处理异常。
try:
operation1
except error:
operation2
else:
operation3
如果try代码块中的代码运行起来没有问题,Python将跳过except代码块;如果try代码块中的代码导致了错误,Python将查找
这样的except代码块,并运行其中的代码,即其中指定的错误与引发的错误相同。try代码中运行成功就继续执行else中的语句。
可以通过:
except error:
pass
使程序在产生错误时什么都不做。
处理ZeroDivisionError 异常
print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
first_number = input("\nFirst number: ")
if first_number == 'q':
break
second_number = input("Second number: ")
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
处理FileNotFoundError 异常
filename = 'alice.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)