第二章 变量和简单的数据类型
在python中,用引号括起的都是字符串,其中引号可以是单引号也可以是双引号。
单引号括起的字符串里面还包含有撇号(即单引号)会发生错误。
对字符串的操作:
- title() 以首字母大写的方式显示每个单词,将每个单词的首字母都显示为大写
- 同样样 + 连接字符串, 称为拼接。
- 在字符串里用 \n 添加换行符,用 \t 添加制表符。
- rstrip() 删除多余的空白
- lstrip() 删除开头的空白
- strip() 删除字符串两端的空白
Python将带小数点的数字都称为浮点数,它指出了一个事实:小数点可出现在数字的任何位置。
但需要注意的是结果包含的小数位数可能是不确定的。
用两个星号表示乘方: 5 ** 2 = 25
>>>0.2 + 0.1
0.300000000004
>>>3 * 0.1
0.300000000004
如果想在字符串中使用整型数变量需使用 str()函数,例如23,对机器而言它可能是数值23,也可能是字符2和字符3。
注:Python2中整数除法的结果只包含整数部分,小数部分被删除。
注释用 # 表示,#当行会被解释器忽略。
第三章 列表简介
列表是由一系列特定顺序排列的元素的组合。
列表是有序集合,可以将任何东西添加入列表,其中的元素之间可以没有任何关系。
Python中用一对 [ ] 表示列表,并用逗号来分隔其中的元素。
访问列表元素和c++相同,使用 [ 索引下标]。不同的是python可将索引指向 -1 来访问列表的最后一个元素,-2访问倒数第二个,以此类推。
仅当列表为空时,这种访问最后一个元素才会错误。
创建的列表大多是动态的,可增删元素。
- .append() 用来往列表末尾添加元素
- .insert() 用来往列表的任意位置添加元素
- del 从列表删除元素,如 del list[0] //删除列表的第一个元素
- .pop() 可删除列表末尾的元素
- .remove(value) 根据值删除元素,删除第一个该值的元素
组织链表:
- .sort() 永久按字母顺序排序,可传递参数 .sort( reverse = True)按字母逆序排序
- sorted() 临时排序,不改变原始列表排列顺序
- .reverse() 反转列表
- len() 确定列表长度
第四章 操作列表(遍历)
magicians = ['aaa', 'bbb' ,'ccc']
for magician in magicians:
print(magician)
#将列表magicians的元素存储到magician,并打印
#注意for最后的冒号,还有缩进
for alien_number in range(0,30):
new_alien = {'color' : ''green', 'points' : '5', 'speed': 'slow'}
aliens.append(new_alent)
#用range函数控制循环次数
Python根据缩进判断代码行与前一个代码行的关系。常见错误;忘记缩进(expected an indented block),不必要缩进(unexpected indent)。
创建数值列表
使用range():打印1~4
for value in range(1 , 5)
print(value)
括号为左闭合区间。
可使用list()函数将range()的结果直接转化为列表
numbers = list(range(1 ,5))
使用函数range()还可指定步长
even_number = list(range(2 , 11 ,2))
print(even_number)
结果;[2, 4, 6, 8, 10]
数字列表的简单统计计算
- min(digits) 找出最大值
- max(digits) 找出最小值
- sum(digits) 求出总和
列表解析
列表解析将for循环和创建新元素的代码合成一行,并自动添加新元素。
squares = [ value**2 for value in range(1 11)]
print(squares)
结果:[1, 4, 9, 16, 25, 36. 40, 49, 64, 81, 100]
使用列表的一部分(切片)
同样是左闭合区间
print(player[1 : 4]) //输出第二个和第三个元素
print(player[ : 4]) //输出从开头到第三个元素
print(player[1 : ])//输出从第二个元素开始的所有元素
print(player[-3 : -1])
for player in players[:3]:
复制列表:
list2 = list1[:] //不能是list1 = list2
一种复制是将list1的副本存储到list2中;第二种复制是将list1和list2关联,它们都指向同一个列表
元组:
看起来想列表,但使用圆括号而不是方括号,创建出来的列表其元素不可以修改,但可以重新定义整个元组。
dimensions =(200 ,50)//不同于列表dimensions =[200 ,50]
第五章 if语句
末尾需要加冒号
if car == 'bwm' :
print(car.upper())
每条if语句的核心都是一个值为True或False的表达式,这种表达式被称为条件测试或者布尔表达式。
检查多个条件;使用关键字and和or
age_0 >= 21 or age_1 >= 21
if-else语句:适合执行两种操作之一的情形
if age >= 18:
print(''.....'')
else:
print(''1111'')
可根据需要使用任意数量的elif代码块(仅适用于只有一个条件满足的情况)
if age < 4:
price = 0
elif age < 18 :
price = 5
elif age < 65 ;
price = 10
else:
price = 5
else代码块可省略
使用多个if语句(适用于多个条件满足的情况)
第六章 字典
字典是一系列键-值对,与键关联的值可以是数字、字符串、列表乃至字典。
alien_0 = {‘color' : 'green', 'points' = 5} //键值之间用冒号隔开,键值对之间用逗号隔开
(类似c++中map的使用方法)
用键获取相关联的值
print(alien_0 ['color'])
字典是一种动态结构,可随时在其中添加键值对。注意键值对的排列顺序与添加顺序不同。
删除键值对,使用del
del alien_0 ['color']
遍历字典: .item()函数返回一个键值对列表,for依次将键和值存储在两个变量中。
for key, value in user_0.items()
键值对的返回顺序也和存储顺序不同。
.key() 函数返回键。
for name in favorite_languages.key();
print(name.title())//将打印出所有关键字
for name in sorted(favorite_languages.keys()):
print(name.title()) //将顺序打印出所有关键字
.value()则返回值。
for language in set(favorite_languages.values()):
print(language.title())
调用set()函数将剔除重复项
6.4 嵌套
有时候需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。
#字典中存储列表
pizza = {
'crust': 'thick',
'toppings': ['mushrooms', 'extra cheese'],
}
#字典中存储字典
users = {
'aeinstein': {
'first' : 'albert',
'last' : 'einstein',
'location' :‘princeton',
},
'musrie': {
'first' : 'marie',
'last‘; 'curie',
'location': 'paris',
},
}
for username, user_info in users.item():
full_name = user_info['first'] + " " + user_info['last']
locatoin = user_info['location']
注意,字典的结构应该相同,这样嵌套的字典处理起来比较容易。
第七章 用户输入和while循环
函数input()让程序暂停,等待用户输入文本。
message = input("Tell me your name")
print(message)
input接收一个参数:即要向用户显示的提示或说明,让用户知道该怎么做。输入的变量存储在变量message中。
若提示内容超过一行,可先将提示存储在一个变量中,再将变量传递给input()
使用input时,Python将用户输入解读为字符串。可使用int()函数转化为数值表示。
在Python2.7中 raw_input和现在的input功能相同,但2.7的input()将输入解读为Python代码。
使用while循环:
定义一个变量,用于判断整个程序是否处于活动状态。这个变量被称为标志。
在任何Python循环都可以使用break语句。比如for循环。
for循环是一种遍历列表的有效形式,但在for循环中不应修改列表,否则将导致Python难以跟踪其中的元素,需要在遍历列表的同时修改元素最好使用while循环。
第八章 函数
函数用def开头,紧跟在del语句后面的所有缩进行构成了函数体。文档字符串的注释描述了函数是做什么的。文档字符串用三引号括起。
函数传递列表,有时候需要禁止函数修改列表,要使用切片将列表的副本传递给函数。
传递任意数量的实参: 形参前使用一个*来创建一个空元组,并将收到的实参存储在这个元组中。
如果函数接受不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后。
使用任意数量的关键字实参:形参前面使用两个**来创建一个空字典,并将收到的所有有名称-值对都封装在这个字典中。
将函数存储在模块中:将函数存储在被称为模块的独立文件中,在使用import将模块导入主程序。
模块的扩展名为.py的文件
#导入整个模块
import pizza
pizza.make_pizza(16, 'pepperoni') //只导入模块需要用句点表示法
#导入特定函数
from pizza import make_pizza
make_pizza(16, 'pepperoni')
#导入模块中的所有函数
from pizza import *
make_pizza(16, 'pepperoni')
使用as给函数指定别名
from pizza import make_pizza as mp
mp(16, 'pepperoni')
使用as给模块指定别名
import pizza as p
p.make_pizza(16, 'pepperoni')//只导入模块需要用句点表示法
第九章 类
在Python中,约定熟成首字母大写的名称指的是类,小写指的是类对象
class Dog():
"""文本字符串"""
def __int__(self, name. age)
"""文本字符串“”“
self.name = name
self.age = age
def sit(self)
"""模拟小狗被命令时蹲下”“”
print(self.name.title() + "is now sitting.")
my dog = Dog( 'while' , 6)
my_dog.sit()
my_dog.roll_over()
第一行类的括号为空表示从空白创建这个类。
在Python2.7中创建类时需要在括号内包含单词object。
方法 __init__()等价于C++的构造函数,类内首个形参必须为self ,它是一个指向实例本身的引用。
类中的每个属性都必须有初始值,哪怕时零或者时空字符串。
也可以在方法__init__内设置默认值,若对某个属性这样做了就无需包含给它提供初始值的形参。
修改属性的值:
- 直接修改属性的值(句点表示法)
- 通过方法修改属性的值
继承:
类的创建并不一定需要从空白开始。一个类继承另一个类时将获得另一个类的所有属性和方法,同时也可以定义自己的属性和方法;原有的类称为父类,而新类称为子类。
class ElectricCar(Car):
""" """
def __init__(self, make, model, year):
""" """
super().__init__(make, model, year)
#super()是一个特殊的函数,帮助Python将父类和子类关联起来,父类也称为superclass
self.battery_size = 70 // 新的属性,且为默认值
def describe_battery(self):
print("asdadasd")
my_tesla = ElectricCar( 'tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
在子类重写父类的方法,仅需在子类定义一个与父类同名的方法。
- 导入单个类
from car import Car
- 导入多个类
from car import Car, ElectriCar
- 导入整个模块
import car
- 导入模块中的所有类
from car import *
Python标准库
模块collections 中的一个类 OrderedDict:
OrdereDict的实例几乎与字典相同,区别只在于记录了键值对的添加顺序。
from collection import OrderedDict
favorite_language = OrderedDIct()
favorite_language['jen'] = 'python'
类编码风格
- 类名用驼峰命名法,即类名中的每个单词首字母大写,而不使用下划线。实例和模块名都是用小写和下划线。
- 对于每个类,都应紧跟在类定义后添加文档字符串。
- 在类中,可使用空行来分隔方法;而在模块中可使用两个空行来分隔类。
第十章 文件与异常
读取文件
with open('pi_digit.txt') as file_object:
contents =file_object.read()
print(contents)
open()接受一个要打开的文件的名称。Python在当前执行的文件所在的目录中查找指定的文件。
也可显示调用close()关闭文件,但Python会自动在合适的时机关闭。
使用read()读取这个文件的全部内容,并将其作为长长的字符串存储在变量contents中。但read()到达文件末尾时返回一个空字符,而将这个空字符串显示出来就是一个空行。
文件路径:
Linux和OS X中的文件路径 with open('text_file/filename.txt') as file_object:
Windows中的文件路径 with open('text_file \filename.txt') as file_object:
注意Windows下为反斜杠。
绝对路径 file_path = 'C:\Users\ehmatthes\other_files\text_file\filename.txt'
逐行读取:
with open('pi_digit.txt') as file_object:
for line in file_object:
print(line.rstrip())
创建一个包含文件各行内容的列表:
with open(filename) as file_object:
line = file_object.readlines() //readlines()返回一个列表,列表存储着每行的字符串,包括开头空格
for line in lines:
print(line.rstrip()) //去除开头的空格
注:读取文件时,Python将其中所有的文本都解读为字符串。
写入文件:
调用open()函数,第一个实参为将打开的文件名;第二个实参为告诉Python将以什么模式打开,提供读取模式(‘r’)、写入模式(’w’)、附加模式(‘a’)或能让你读取和写入文件的模式(’r+‘)。若省略了第二个实参,Python将以默认的只读模式打开文件。
若写入的文件不在,函数open()将自动创建它。然而以写入(‘w’)模式打开文件时要千万小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件,若不想清空而时想再末尾继续写入应以附加模式(‘a’)模式打开。
注:Python只能将字符串写入文本文件。要将数值存入必须使用str()。
异常:
try-except(-else)
方法split()根据一个字符串创建一个单词列表,以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中,其中这些部分可能包含标点。
try:
--snip--
expect FileNotFoundError:
pass //pass告诉Python将什么都不发生,程序正常进行,不会出现trace back
else:
--snip--
存储数据
使用模块json来蹲存储数据。
使用json.dump()和json.load():
json.dump()接受两个实参:要存储的数据以及一个可用于存储数据的文件对象。
import json
numbers = [2, 5, 7, 9]
filename= 'number.json'
with open(filename, 'w') as f_obj:
json.dump(number, f_obj)
#将列表存储到文件numbers.json中
将代码划分为一系列完成具体工作的函数的过程称为重构。