前言
参考资料:
笔者 Python 学习次要以《Python 编程:从入门到实战》这本书为主,笔记的思路参考书里的脉络。其次还有笔者一年前在慕课上看的北理的嵩天传授的 Python 课程。嵩天传授的课很好,最大的特点是每个版块都有残缺的示例代码。但可能对老手小白不太敌对,有些不罕用的函数容易弄混。《Python 编程:从入门到实战》更适宜零根底学习,里边会提到一些互通的编程思维和 Python 的格局标准。
联合罕用函数、办法:
因为笔者有 Java 的编程根底,因而这里只记录 Python 跟 Java 不一样的中央以及一些易忘点和难点,重点放在 Python 的语法根底。对于老手敌人还是先看书为好。联合《Python 罕用函数、办法示例总结(API)》来看可能成果会好一些。
1. 变量与简略数据结构
.py
指出这是一个 Python 程序,编辑器 将应用 Python解释器 运行它;- Python解释器 读取整个程序,确定其中每个单词含意;
- 程序无奈胜利运行时,解释器会提供一个
traceback
。traceback 是一条记录,指出解释器尝试运行代码时,在什么中央陷入困境; - 在 Python 中,能够用 单引号 或双引号 括起字符串;
-
Python 中的本义符:
\n
换行(光标到上行首);\r
回车(光标回到本行首);\t
制表符,\n\t
示意换行并在下一行结尾增加制表符;\b
回退;
- Python2 中,有些
print
语句蕴含括号,有些不蕴含; - Python 应用 两个乘号示意乘方,如:
3 ** 2 == 9
; - Python2 中 除法
\
将小数局部间接删除。Python3 中保留小数。但在 Python2 中:3.0 / 2 == 1.5
; - Python 之禅 :Python 的一些编程理念。在终端输出
import this
即可获取; - Python 关键字:
-
Python 内置函数:
2. 列表相干 ======== 一个列表示例:bicycles = ['trek', 'cannondale', 'redline']
。留神 方括号 与逗号; 打印列表示例:print(bicycles)
; 拜访列表元素:bicycles[0]
— > trek; 拜访列表倒数第 x 元素:bicycles[-x]
— > 当 x = 1 时输入:redline;* 应用for 循环遍历列表:`
for object in list:
print(object) - 列表解析:
list = [num**2 for num in range(1s, 11)]
—> 输入 1 到 10 的平方; - 遍历局部列表:
for object in list[firstNum: lastNum]:
; - 能够应用
list[:]
的办法复制列表; -
元祖 相干:
- Python 中将不能批改的值称为不可变的,而不可变的列表称为 元祖;
- 在编程上与列表不同之处在于其应用
()
或tuple()
或不应用括号;而 列表 应用[]
或list()
; - 元组因为创立后不能批改,因而没有非凡操作;
-
如果提出批改 Python 语言批改倡议,须要编写 Python 改良提案(PEP)。PEP 8是最古老的 PEP 之一,其规定了以下一些 Python 代码格局标准:
- 每级缩进 4 个空格。须要对文本编辑器(或 ide)设置 tab 键为 4 个空格;
- Python 解释器依据程度缩进解读代码,不关怀垂直间距;
- 倡议每行不超过个字符;
- 倡议比拟运算符两边各增加一个空格;
3. 汇合
- 一个汇合示例:
bicycles = {'trek', 'cannondale', 'redline'}
。留神 大括号 与逗号; - 汇合的特点是不能反复;
-
利用汇合数据去重:
s = set(list) #利用汇合无反复元素的特点去重 l = list(s) #将汇合转变回列表
4. If 语句
- Python 在查看是否雷同时思考大小写;
- 大部分时候查看两个指不等的效率更高;
- 在 Python 中应用
and
和or
示意并与或,而不是&&
和||
; - 查看列表是否含有特定值的语句:
if(object in list)
,也能够用if(object not in list)
; -
Python 的 if 语句根本构造如下(留神冒号):
`
if conditional_test1:
do something1
elif conditional_test2:
do something2
else:
do other - 判断列表是否为空:
if list:
5. 字典
- 事实上,可将任意 Python 对象用作字典中的值;
- 一个 字典 的示例:
alien0 = {'color': 'green', 'points': 5}
- 遍历字典:
for key, value in map.items():
- 遍历字典的键 :
for object in map.keys():
或for object in map:
,因为遍历字典默认遍历所有的键; - 按程序遍历字典所有的键:
for object in sorted(map.keys()):
- 遍历字典的值:
for object in map.values():
- 遍历字典的值,剔除反复项:
for object in set(map.values()):
- 列表和字典的嵌套层级不应太多,如果太多,可能有更简略的解决问题的计划;
6. 用户输出和 while 循环
- 在 Python 3 里应用
input()
办法,而在 Python 2.7 里应用raw_input()
办法; - 循环语句:
while conditional_test:
- 能够应用
break
关键字退出循环,这里的循环包含 while 和 for 循环; - 能够应用
continue
关键字持续循环; - 应用循环解决列表:
while object in list:
7. 函数
-
不带返回值的函数定义示例:
def greet_user(username, age=1): #username 没有设定默认值必须放在形参列表结尾 """显示简略问候语""" print("hello," + username.title() + ", age is" + str(age)) greet_user('jesse', 18) #地位实参 greet_user(age=18, username='jesse') #关键字实参 greet_user('jesse') #应用默认值 age=1
- 第二行为 文档字符串正文,形容函数是做什么的;
- 前面为函数调用;
-
带一般返回值的函数定义示例:
def greet_user(username, age=1): #username 没有设定默认值必须放在形参列表结尾 """显示简略问候语""" print("hello," + username.title() + ", age is" + str(age)) return username.title()
-
带字典返回值的函数定义示例:
def build_person(first_name, last_name): #username 没有设定默认值必须放在形参列表结尾 """返回字典""" person = {'first': first_name, 'last': last_name} return person
-
传递列表参数,列表会批改:
def greet_users(names): """传入参数为列表""" for name in names: msg = "Hello," + name.title() + "!" print(mas) usermanes = ['margot', 'hannah', 'ty'] greet_users(usernames)
- 传递列表参数的正本,列表不会批改:
def greet_users(names[:]):
-
传递任意数量的实参:*toppings能够了解成列表;
def make_pizza(*toppings): """打印顾客点的所有配料""" print(toppings) make_pizza('pepperoni') make_pizza('mushrooms', 'green peppers', 'etra cheese')
- Python 创立一个名为 toppings 的空元组;
-
联合应用地位实参和任意数量实参:
def make_pizza(size, *toppings):
- 必须将接收任意数量实参的形参
*toppings
放在最初;
- 必须将接收任意数量实参的形参
-
应用任意数量的关键字实参:\user\_info** 能够了解成字典;
def build_profile(name, **user_info): """创立一个字典,其中蕴含咱们晓得的无关用户的所有""" profile = {} profile['name'] = name for key, value in user_info.items(): profile[key] = value return profile user_profile = build_profile('albert', location='princeton', field='physics') print(user_profile)
- 在 Python 中,import 的是模块,应用 模块. 办法 (参数) 即可调用模块里的函数;
-
导入特定函数,并应用该函数示例:
`
from module_name import function_0, function_1
function_0()
function_1(参数) - 应用
as
给函数指定别名:from model import function as fn
;后续应用fn()
即可调用 function 函数; - 应用
as
给模块指定别名:import model as md
;后续应用md.function()
即可调用函数; - 导入模块所有函数:
from model import *
;后续间接应用 model 里的函数function()
即可调用函数; - 能够在函数类应用
global
关键字申明变量是全局变量; -
lambda 表达式:
< 函数名 > = lambda < 参数 > : < 表达式 >
;-
示例:
>>> f = lambda x, y : x + y >>> f(10, 15) 25 > > > f = lambda : "lambda 表达式" > > > print(f()) > > > lambda 表达式
-
-
函数与模块编写细节:
- 内部函数导入的举荐做法:只导入所须要应用的函数 / 导入整个模块并应用句点表示法;
- 函数和模块的命名应应用小写字母和下划线,而不是驼峰命名法;
- 函数正文紧跟在函数定义前面,应用文档字符串格局;
- 给形参指定默认值时,等号 =两边不要有空格;
8. 类与对象
- 类中的函数叫办法;
-
一个类示例:模块名为
dog.py
"""示意小狗和电子狗的类""" class Dog(): """模仿小狗""" def __init__(self, name): """初始化实例""" self.name = name self.age = 1 #给属性指定默认值 def get_age(self): """返回年龄""" return self.age def set_age(self, age): """设置年龄""" self.age = age def sit(self): """模仿小狗被命令时蹲下""" print(self.name.title() + "is now sitting.") class TinyDog(Dog): """小狗是狗的子类""" def __init__(self, name) """初始化父类的属性""" super().__init__(name)
__init__()
办法:形参 self 必不可少,而且必须位与其余参数后面;- 创立 Dog 实例时,将主动传入实参 self。每个与类相关联的办法调用都主动传递实参 self,其是一个指向实例自身的利用,让实例可能拜访类中的属性和办法;
self.
为前缀的变量都可供类中的所有办法应用,像这样能够通过实例拜访的变量称为属性;
-
无关父子类:
- 子类和父类必须蕴含在以后文件中,父类必须在子类后面;
- 子类定义中括号内必须指定父类名称;
super()
是一个非凡函数,将父类和子类关联起来;- 在 Python 2.7 中,
super()
办法须要传递两个实参:子类名 和self,并且父类定义的括号内指定字段object;
- 在 Python 2.7 中创立类时,须要在括号类内蕴含单词object:
class ClassName(object):
-
类实例(对象)的示例:
class Dog(): --snip-- my_dog = Dog('willie') dog_name = my_dog.name #获取属性 dog_name = my_dog.get_age() #通过办法获取属性 my_dog.name = 'jucy' #间接批改属性 my_dog.set_age = 18 #通过办法批改属性 my_dog.sit() #调用办法
- 从 dog.py 模块里导入多个类:
from dog import Dog, TinyDog
; - 导入整个 dog.py 模块,而后用句点示意拜访须要的类:
import dog
; - collections 模块里蕴含一个类
OrderedDict
。该类的实例行为简直与字典雷同,区别在于其记录了 键值对 的程序; -
类的编码格调:
- 类采纳驼峰命名法,类中的每个单词首字母大写;
- 实例名和模块名采纳小写,并在单词之间加上下划线;
- 一个空行分隔办法;两个空格分隔类;
- 须要同时导入规范库和模块和
9. 文件
-
关上并读取一个文件,并将其内容显示到屏幕上:
with open('xxx.txt') as file_object: contents = file_object.read() print(contents)
- 关上文件
open()
和敞开文件close()
能够同时应用,但当有 bug 时close()
执行不了会导致文件无奈敞开。不写close()
将由 Python 确定是否敞开文件; with
关键字在不再须要拜访文件后将其敞开;- 间接打印 contents 会多出一个空行,能够这样打印
print(contens.rstrip())
;
- 关上文件
-
无关文件绝对路径:
- Linux 和 OS X:
file_path = '/home/.../xxx.txt'
; - Windows:
file_path = C:\...\xxx.txt
; - 倡议将数据文件存储在程序文件所在的目录,或程序文件所在目录的下一级文件夹;
- Linux 和 OS X:
-
逐行读取:
with open(filename) as file_object: for line in file_object: print(line)
- 同理,间接打印 contents 会多出一个空行,能够这样打印
print(line.rstrip())
;
- 同理,间接打印 contents 会多出一个空行,能够这样打印
- 应用
with
关键字时,open()
返回的对象只在 with 代码块内可用; - 在解决文件相干时留神应用
strip()
或rstrip()
去除字符串两边的空格; - Python 将所有文本都解读成字符串;
-
open('xxx.txt', 'w')
:以写入形式关上文件;- 其余参数还有
r
读取、a
附加、r+
读写; a
附加:将内容附加到文件开端,而不是覆盖文件原来的内容;- 以
w
写入模式关上文件须要小心,如果指定文件名已存在,Python 将在返回对象前清空文件; - Python 只能将字符串写入文本文件;
10. 异样
- 其余参数还有
-
应用 try-except 解决异样:
try: print(5/0) except ZeroDivisionError: print('捕捉到 ZeroDivisionError 异样') else: print('未捕捉异样') finally: print('无论是否有异样都会执行')
- 可在
except
的缩进块里增加关键字 pass 跳过谬误捕捉; - 其中,
else
和finally
局部的代码块可省;
11. 测试
- 可在
- 应用 Python 规范库中的模块
unittest
进行测试; -
一个简略的测试示例:
import unittest from model_name import function_name class TestCase(unittest.TestCase): """测试函数 function_name""" def setUp(self): """构建前置条件""" def test_function(self): run_result = function_name(parameter) self.assertEqual(run_result, correct_result)
* 首先导入模块 `unittest` 和被测试方法 `function_name`;* 而后创立 `TestCase` 类,其蕴含各种具体的单元测试办法。该类继承 `unittest.TestCase` 类;* `setUp()` 办法的作用是创立前置条件;* 编写测试方法 `test_function`,办法名必须以 `test_` 打头;* 应用断言 `assertEqual()` 判断函数执行后果与预期后果的差异;* `unittest.main()` 让 Python 运行这个文件中的测试;* unittest 里罕用的 6 个断言办法请见;* 每实现一个测试,Python 都会打印一个字符:* 测试通过打印句点 `.`;* 测试引发谬误打印一个 `E`;* 测试导致断言失败打印一个 `F`;