起步
- 命令行运行
python
即可查看安装信息 - 运行如下python代码也可查看安装版本:
import sys
print (sys.version)
注意: Python3 和Python2的输出语法不一样,一个要括号,一个不要括号
- Sublime里面python运行环境的安装:Tools->Building System->New Build System,输入以下代码:
{
"cmd": ["******","-u","$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
}
其中
******
填入你的python安装目录路径,比如”D:/Python36/python3.exe”,注意路径中的斜杠方向
变量和简单数据类型
变量
- 变量名只能包含字母、数字和下划线,且以字母或下划线打头
字符串
- 字符串可以是单引号也可以是双引号
title()
将每个单词的首字母改为大写upper()
将字符串全部改为大写lower()
将字符串全部改为小写+
号用来拼接- 制表符
\t
,换行符\n
str()
将非字符串值表示为字符串,如str("23")
将整型23变成字符串strip()
返回字符串去掉左右两边指定字符或者空格(未指定字符时)的副本;同理还有lstrip()
和rstrip()
去掉左边和右边的指定字符。
数字
+ - * /
表示加减乘除运算注意python3中
3/2
输出结果1.5
,但是在python2中输出为1
两个乘号
**
表示乘方题外话:使用
import this
可以查看编写python代码的指导原则(python之禅)。不要企图编写完美无缺的代码;先编写行之有效的代码,再决定是对其做进一步的改善还是转而去编写新代码。
列表
表示
- 用方括号
[ ]
表示列表,用逗号分隔。 - 索引从0开始;可以直接用-1返回最后一个元素,或者-2返回倒数第二个元素
添加元素
- 使用
.append(value)
向列表末尾添加元素value - 使用
.insert(index,value)
向列表中索引index的地方插入元素value
删除元素
已知元素索引
- 使用
del
删除元素。如del motos[1]
删除了列表motos中的第二个元素 - 使用
.pop(index)
来弹出元素。弹出指定index位置的元素,若未指定index则弹出列表末尾元素
已知元素值
- 使用
.remove(value)
来删除第一个值为指定的value的元素
组织列表
- 使用
.sort()
方法对列表永久性排序;通过.sort(reverse=True)
进行逆序排序 - 使用
sorted(list)
方法对list列表进行临时排序。比如sorted(cars)就是对cars进行临时排序。 - 使用
.reverse()
方法反转列表中元素的排列顺序 - 使用
len(list)
方法获取list列表的长度
操作列表
- 使用
for item in items:
进行遍历
注意冒号和代码缩进
- 使用
list(range(1,6))
生成列表[1,2,3,4,5]
;使用list(range(2,11,2))
生成列表[2,4,6,8,10]
- 对数字列表
digits=[1,2,3,4,5,6,7,8,9,0]
使用min(digits)
、max(digits)
、sum(digits)
找出列表的最小值、最大值和总和。 - 使用
squares=[value**2 for value in range(1,5)]
来生成列表squares=[1,4,9,16]
- 使用
digits[from:to]
返回digits列表从索引from到to的一个切片。to为空表示到列表末尾,为-1表示到最后一个元素为止。from也是如此。 使用
list_copy=list[:]
来复制一个列表注意:
list_copy=list
会让list_copy和list指向同一个列表不可变的列表称为元组tuple,其元素值不可改变。元组用法和列表类似,但是元组使用圆括号而不是方括号来标识。
if语句
- 一个等号
=
是赋值,两个等号==
是条件判断“相等?”,!=
表示“不相等?” - 逻辑连接词,
and
必须全部为真则为真;or
至少一个为真则为真 - 检查特定值是否包含在列表中用
in
;检查特定值是否不包含在列表中用not in
- 使用
if-elif-else
结构,更常用if-elif-elif
- 使用
if list:
来判断list是否为空
字典
{"key1":"value1","key2":"value2"}
存储键值对信息。注意:python不关心键值对的添加顺序,只关心键和值的关联关系
使用
del dic_name["key"]
删除键值对- 使用
for key,value in dic.items():
来遍历字典 使用
for key in dic.keys():
来遍历字典中的所有键注意:遍历字典时,会默认遍历所有的键。因此将代码
for key in dic.keys():
替换成for key in dic:
结果是一样的使用
for value in dic.values()
可以遍历字典中所有的值可以嵌套使用
sorted()
来临时排序,使用set()
来过滤重复值在字典中嵌套列表,在字典中嵌套字典,在列表中嵌套字典
用户输入和while循环
代码
message=input("Please enter: ")
给出输入提示,并将输入存放在message中注意:python将用户输入作为字符串存入。在需要时可以用
int()
将其转换成数字
区别:python2中使用raw_input()
作为输入(和python3中的input()
功能一样),python2中也包含input()
函数,但其将用户输入解读为python代码关键字
break
、continue
,还有while循环条件,标志的运用- 使用如下代码删除pets列表中的所有cat元素
while 'cat' in pets:
pets.remove('cat')
函数
定义函数
- 函数常见格式如下
def function_name(args):
"""文档字符串docstring的注释,用三引号括起,描述函数的功能"""
print ("Hello")
位置实参
- 函数调用时形参基于实参的顺序依次关联,这种方式是位置实参
- 如下使用位置实参函数调用,必须注意参数顺序
def person(name,age):
print (name+" is "+age)
person("xgx","23")
关键字实参
- 用名称-值对传递给函数
def person(name,age):
print (name+" is "+age)
person(age="23",name="xgx")
- 使用关键字实参时,务必准确地指定函数定义中的参数名
默认值
- 编写函数时可以给每个形参指定默认值
def person(name,age="23"):
print (name+" is "+age)
person("xgx")
- 使用默认值时,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参
传递任意数量的实参
- 对如下代码,形参名*toppings中的星号让python创建一个名为toppings的 空元组 ,并将收到的所有值都封装到这个元组中
def make_pizza(*toppings):
"""打印顾客点的所有配料"""
print (toppings)
- 下面函数的定义要求提供名和姓,同时允许用户根据需要提供任意数量的键值对。形参user_info中的两个星号让Python创建一个名为user_info的 空字典** ,并将收到的所有名称-值对都封装到这个字典中。
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='princetion',field='physics')
print (user_profile)
# output: {'first_name': 'albert', 'last_name': 'einstein', 'location': 'princetion', 'field': 'physics'}
将函数存储在模块中
- 导入整个模块,使用import语句导入名为moudle_name.py的整个模块。
import module_name
moudle_name.function_name()
- 导入模块中的特定函数
from module_name import function_name
from module_name import function_0, function_1, function_2
- 使用as给函数指定别名
from module_name import function_name as fn
- 使用as给模块指定别名
import module_name as mn
- 导入模块中的所有函数
from module_name import *
注意:由于导入了每个函数,可通过名称来调用每个函数,而无需使用句点表示法。然而python可能遇到多个重名的函数或者变量,进而覆盖函数。所以推荐做法是要么只导入你需要的函数,要么导入整个模块并使用句点表示法。
函数编写指南
- 应该给函数指定描述性名称,且只使用小写字母和下划线;给模块命名时也应如此
- 采用文档字符串格式简要地阐述函数的功能
- 给形参指定默认值时,等号两边不要有空格
- 如果程序或模块包含多个函数,使用两个空行将相邻的函数分隔开
- 所有的import语句都应放在文件开头
类
创建和使用
- 常见结构如下
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
"""初始化描述汽车的属性"""
self.make = make
self.model = model
self.year = year
def get_descriptive_name(self):
"""返回整洁的描述信息"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
my_car = Car('audi', 'a4', 2016)
print(my_car.get_descriptive_name())
__init__()
方法,每次实例化类时都会运行此方法。此方法必须包含形参self
,它是一个指向实例本身的引用。
在python2中创建类需要在定义类时括号中包含单词object,如
class Car(object):
- 类中的每个属性都必须有初始值,即使这个值是0或者空字符串。可以无需提供初始值的形参,而在init()方法中设置属性的默认初始值
继承
- 创建子类时,父类必须包含在当前文件中,且位于子类前面。定义子类时,必须在括号内指定父类的名称。子类继承父类所有的属性和方法。
- 子类继承写法如下,另添加了特有属性battery_size
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性,再初始化电动汽车特有的属性"""
super().__init__(make, model, year)
self.battery_size = 70
- python2中的继承稍有不同:函数super()中需要两个实参,子类名和对象self
class Car(object):
def __init__(self, make, model, year):
# snip
class ElectricCar(Car):
def __init__(self, make, model, year):
super(ElectricCar, self).__init__(make, model, year)
# snip
- 在子类中定义和父类同名的方法即是方法重写
- 将实例用作属性,如下ElectricCar中的battery的使用
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_name import class_name
from module_name import class_0, class_1
- 你还可以导入整个模块,再使用句点表示法访问需要的类。推荐使用此方法。使用
module_name.class_name
语法
import module_name
- 导入模块中所有的类。不推荐此方法。
from module_name import *
- 还在一个模块中导入另一个模块
Python标准库
- python标准库是一组模块,你可以使用标准库中的任何函数和类。
- 模块collections中的OrderedDict类创建一个字典,并记录其中的键-值对的添加顺序。它兼具列表和字典的主要优点。
from collections import OrderedDict
my_dic = OrderedDict()
类编码风格
- 类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。
- 对每个模块和每个类,应该包含一个文档字符串描述其功能。
- 在类中使用一个空行来分割方法;而在模块中使用两个空行来分割类。
- 需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句。
文件和异常
从文件中读取数据
- 读取文件示例如下:
with open("pi.txt") as file_object:
contents = file_object.read()
print(contents)
with关键字在不再需要访问文件后将其关闭
- 可使用相对路径或者绝对路径访问文件。如下是Linux和OS X系统中的示例:
file_path = '/home/gabear/other_files/text_files/filename.txt'
with open(file_path) as file_object:
- 在Windows系统中,需要使用反斜杠
\
。由于反斜杠在python中被视为转义标记,为在Windows中确保万无一失,应以原始字符串的方式指定路径,即在开头的单引号前加上r
。Windows系统中示例如下:
file_path = r'C:\Users\gabear\other_files\text_files\filename.txt'
with open(file_path) as file_object:
推荐将数据文件存储在程序文件所在的目录,然后使用相对路径访问
- 逐行读取文件内容。示例如下:
filename = 'pi.txt'
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
在文件中,每行的末尾都有一个换行符,而print语句也会加上一个换行符,因此打印出来结果每行末尾都有两个换行符。可用
rstrip()
去除空行。
- 读取并使用文件内容。示例如下:
filename = 'pi.txt'
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
注意:读取文本文件时,Python将其中的所有文本都解读为字符串。若读取并使用数值,需要使用
int()
或float()
将其转换成整数或浮点数。
写入文件
- 写入文件示例如下
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write('I love reading.\n')
file_object.write('I love programming.\n')
open()
的第二个实参可以是读取模式'r'
、写入模式'w'
、附加模式'a'
或者能够读取和写入文件的模式'r+'
。如果省略了模式参数,Python将以默认的只读模式打开文件。- 如果你要写入的文件不存在,函数open()将自动创建它。注意若以写入模式
'w'
打开文件时若文件已存在,Python将在返回文件对象前清空该文件。
异常
- 异常示例如下:
def count_words(filename):
"""计算一个文件大致包含多少个单词"""
try:
with open(filename) as file_object:
contents = file_object.read()
except FileNotFoundError:
print("Sorry, the file " + filename + " does not exist.")
else:
# 计算文件大致包含多少个单词
words = contents.split()
num_words = len(words)
print("The file " + filename + " has about " + str(num_words) + " words.")
filename = 'programming.txt'
count_words(filename)
方法
split()
以空格为分隔符将字符串分拆成多个部分,并存储到列表中。
- 代码块
try-except-else
的工作原理大致如下:Python尝试执行try代码块中的代码,只有可能引发异常的代码才需要放在try语句中;依赖于try代码块成功执行的代码都应放在else代码块中;except代码块告诉Python,如果它尝试运行try代码块中的代码时引发了指定的异常,该怎么办。 - 一些其他关键词用法:
try:
# code
except ZeroDivisionError as e:
raise e
else:
pass
存储数据
- JSON(JavaScript Object Notation)。主要是json模块的使用,包括
json.dump()
和json.load()
。函数json.dump()接收两个实参:要存储的数据以及可用于存储数据的文件对象。 - 一个小例子如下:
# number_writer.py
# json.dump()存储数据
import json
numbers = [2, 3, 5, 7, 11]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj)
# number_reader.py
# json.load()读取数据
import json
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)
print(numbers)
测试代码
测试函数
- 一个完整的测试函数的例子:
# name_function.py
def get_formatted_name(first, last, middle=''):
"""生成整洁的姓名"""
if middle:
full_name = first + ' ' + middle + ' ' + last
else:
full_name = first + ' ' + last
return full_name.title()
# test_name_function.py
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""测试name_function.py"""
def test_first_last_name(self):
"""能够正确地处理像gao xiong这样的名字吗?"""
formatted_name = get_formatted_name('gao', 'xiong')
self.assertEqual(formatted_name, 'Gao Xiong')
def test_first_last_middle_name(self):
"""能够正确地处理像xiong gao xiong这样的名字吗?"""
formatted_name = get_formatted_name('xiong', 'xiong', 'gao')
self.assertEqual(formatted_name, 'Xiong Gao Xiong')
unittest.main()
- 首先必须导入模块
unittest
和要测试的函数;- 然后创建继承
unittest.TestCase
的类,你可以随便给这个类命名,但最好让它看起来与要测试的函数有关,并包含Test字样;- 在类中编写测试方法,测试方法名必须以
test_
打头,这样Python才会自动运行;- 最后注意
.assertEqual()
断言方法的使用。
测试类
- Python在
unittest.TestCase
类中提供了很多断言方法。下表描述了6个常用的断言方法。
方法 | 用途 |
---|---|
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 中 |
在
unittest.TestCase()
类中包含了setUp()
方法,Python将先运行它,再运行各个以test_
打头的方法。这样,测试类下面的每个测试方法都可以使用在方法setUp()中创建的对象了。这个方法很实用。运行测试用例时,每完成一个单元测试,Python都打印一个字符:测试通过时打印一个句点;测试引发错误时打印一个E;测试导致断言失败时打印一个F。
参考书籍:《Python编程从入门到实践》,【美】Eric Matthes 著,人名邮电出版社