<Python从入门到实践>读书笔记
Contents
退出
Ctrl-D
或
exit()
基础
字符串
有引号括起来的都是字符串, 引号既可以是单绰号
, 也可以是双引号
.
- 字符串拼接: 使用
+
- 将数字转换为字符串, 使用函数:
str()
乘方
>>> 3 ** 2
9
Python 之禅
import this
列表
hello=['hello', 'world']
print(hello)
- 索引从0开始
最后一个的索引是 -1
# 追加元素 hello.append('hello2') # 插入元素 hello.insert(0, 'hello2') # 删除 del hello[0] # 根据值删除元素, 这种只是删除第一次出现的元素. hello.remove('hello') # 弹出元素(从索引-1开始弹出, 即最后一个元素), 这时 hello 是弹出后的列表, 返回值是弹出的元素 hello.pop() 也可以指定索引 popedElement = hello.pop(0)
排序
# 默认是从小到大, 这会影响原来的hello顺序的
hello.sort()
# 从大到小
hello.sort(reverse=True)
hello.reverse()
# 返回排序的列表, 但不影响原来的顺序
sorted(hello)
长度
len(hello)
遍历列表
for e in hello:
print(e)
注意, 后面的冒号.
缩进
python 是根据缩进来判断代码行与前一个代码行的关系的.
数值列表
for value in range(1,5):
print(value)
注意, 区间是 [1,5)
将 range 的结果转换为列表: numbers=list(range(1, 5))
range 的第三个参数是步长.(step)
对数值列表统计
sum(numbers)
min(numbers)
max(numbers)
切片
numbers[0:3]
索引为负时, 表示倒数开始.
这时, 是直接复制元素的. 它并不会影响原有的列表.下面的代码反映了这点:
>>> num=list(range(1,11))
>>> print(num)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> slice1=num[1:3]
>>> print(slice1)
[2, 3]
>>> slice1[0]=100
>>> print(slice1)
[100, 3]
>>> print(num)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>>
所以, 想复制整个列表, 则可以同时省略开始和终止索引即可: [:]
列表推导式
listdata = [1, 5, 2, 9, 10, 22, 3, 99, 1000, 999, 500]
获取上面偶数组成的列表
[i for i in listdata[1:] if i % 2 == 0]
运行示例
>>> listdata = [1, 5, 2, 9, 10, 22, 3, 99, 1000, 999, 500]
>>> [i for i in listdata if i % 2 == 0]
[2, 10, 22, 1000, 500]
>>>
元组
元组的元素是不可修改的. 即不变的列表, 就称为元组.
定义元组
numbers=(200, 50)
获取元素
numbers[0]
修改元素
哈哈, 这是禁止的操作
遍历
for m in numbers:
print(m)
修改元组变量
虽然元组的元素是不能修改的, 但可以修改元组变量自身.
numbers=(100, 25)
这时, numbers 元组就是新的 (100, 25)
而不是原来的 (200, 50)
了.
if
if condition:
do something
elif condition1:
do something
else:
do something
注意冒号.
and 与 or
condition1 and condition2
condition1 or condition2
in 与 not in
判断元素是否包含在列表中
elementX in aList
elementX not in aList
布尔值 True 与 False
注意是 True
与 False
首字母大写的.
空列表也可以当作条件. 如果列表为空, 则返回 False
否则返回 True
>>> hello=[]
>>> hello and True
[]
>>> hello or True
True
>>>
字典
定义
a = {'color':'green', 'point': 5}
添加
a['hello'] = 'b'
修改
a['hello'] = 'newb'
删除
del a['hello']
遍历
for k, v in a:
print(k)
print(v)
遍历所有键
for k in a.keys():
print(k)
按字典顺序遍历键
for k in sorted(a.keys()):
print(k)
遍历所有值
for v in a.avalues():
print(v)
去掉重复
for k in set(a.keys()):
print(k)
用户输入
input()
等待用户输入, 回车后继续执行. (在 2.7 版本中, 对应的是 raw_input())
字符串转换为 int
i = int(inputString)
while 循环
while condition:
do something
函数
定义
def greet_user(username='默认值'):
"""hello doc"""
print("hello " + username.title())
调用
greet_user('hello')
或
greet_user(username='hello')
任意实参
def make_pizza(*toppings):
print(toppings)
即 *变量名
调用时: make_pizza('hello', 'world')
这种是把 toppings
当作列表来看待了.
还有一种是当作k-v
字典来对待
def make_pizza(**user_info):
for k, v in user_info:
print(k)
print(v)
导入
导入模块
import module_name
调用
module_name.function_name(parameters)
给模块起别名
import module_name as mn
调用
mn.function_name(parameters)
导入特定函数
from module_name import function_name
导入所有函数
from module_name import *
调用
function_name(paramters)
给函数起别名:
from module_name import function_name as fn
调用:
fn(paramters)
类
class Dog():
"""class doc"""
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
"""dog sit"""
print(self.name + " is now sitting")
创建实例
my_dog=Dog('name', 6)
访问属于
my_dog.name
访问方法
my_dog.sit()
继承
class ADog(Dog):
def __init__(self, name, age):
super().__init__(name, age)
重写父类方法
定义一个与类类方法同名即可.这样, python 就不会考虑父类方法了.
文件
读取整个内容
with open('pi_digits.txt') as file_object:
contents = fil_object.read()
print(contents)
按行读
with open('pi_digits.txt') as file_object:
for line in fil_object:
print(contents.rstrip())
或
with open('pi_digits.txt') as file_object:
for line in fil_object.readlines():
print(contents.rstrip())
写入空白文件
with open(filename, 'w') as file_object:
file_object.write('hello')
追加文件
with open(filename, 'a') as file_object:
file_object.write('hello')
捕获异常
try:
print(5/0)
except ZeroDivisionError:
print("can not divide by zero")
存储数据
json.dump()
json.load()
单元测试
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""测试name_function.py"""
def test_first_last_name(self):
"""能够正确地处理像Janis Joplin这样的姓名吗?"""
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
unittest.main()
杂项收集
文件编码
在每个文件最开始处加上以下语句即可
# -*- coding: utf-8 -*-
乱码时
import sys
reload(sys)
sys.setdefaultencoding('UTF8')
requests 请求返回的乱码时
response = requests.get('http://www.csindex.com.cn/data/js/show_zsgz.js', headers=headers, params=params, cookies=cookies)
response.encoding = "GBK"
body = response.text
升级某包
sudo pip[或 pip3] install --upgrade requests[这里是包名]
如:
sudo pip install --upgrade requests
sudo pip3 install --upgrade requests
SSL 错误
Caused by SSLError(SSLError(1, '_ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed'
python2 下要安装:
pip install certifi
pip install urllib3[secure]
仅一个元素的元组参数时
('hello',)
注意, 是 ('hello', )
, 后面的逗号不能省略.
可变参数
*args
这表示它接收的可变参数(按任意参数个数来传). (python 会自动将这些参数, 封装成元组)
**keywords
这表示它接收的是字典的可变参数.(即所有 key=value 的形式的参数, 都会被 python 封装为这包含这些参数的字典)
str -> float
f = float(str)