退出

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

注意是 TrueFalse 首字母大写的.

空列表也可以当作条件. 如果列表为空, 则返回 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 错误

doc

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)