快速转入Python笔记

前言

这篇文章是一份笔记,旨在快速入门Python,阅读前提是有其他面向对象编程的经验,比如C++或者Java。所有内容只涉及Python3。全文参考《Python编程 从入门到实践》,了解详情可参考该书。

变量和简单类型

1
2
#打印的Function,Python中不需要;结束语句
print()
1
2
#双引号和单引号都可以用来表示字符串
'abc', "abc"
1
2
3
4
#title() Method 使首字母变成大写
#顺便注意,Python中不需要进行显示类型声明
name = 'abc'
print(name.title())
1
2
3
4
#upper() Method 使字符串全变为大写
name.upper()
#lower() Method 使字符串全变为小写
name.lower()
1
2
#字符串可以直接相加
name += "abc"
1
2
3
4
5
6
#字符串的rstrip() Method 临时性去掉末尾的空白字符
name.rstrip()
#字符串的lstrip() Method 临时性去掉开头的空白字符
name.lstrip()
#字符串的strip() Method 临时性去掉开头和结尾的空白字符
name.strip()
1
2
3
#在python中 ** 表示乘方
age = 3 ** 2
#age为9
1
2
#str() Function 将非字符串值转化为字符串值
agestr = str(23)
1
#在python3中 整数 除以 整数 除不尽会得到 小数

列表简介

1
2
#中括号初始化,允许一个列表存不同类型的值
names = ['Bob', 'Jan', 12, True]
1
2
#append() Method 在列表末尾添加元素
names.append('John')
1
2
#insert() Method 在任何位置添加新元素
names.insert(0, 'Chris')
1
2
#del 关键字 删除给出位置的列表元素
del names[0]
1
2
3
4
#pop() Method 删除列表末尾的元素,并返回删除的值
poped_name = names.pop()
#pop() Method 也可以弹出任意位置的元素
poped_name = names.pop(0)
1
2
#remove() Method 根据值删除*第一次*出现的该元素
names.remove('John')
1
2
3
4
#sort() Method 永久让列表升序排列
names.sort()
#降序则需传递reverse参数
names.sort(reverse=True)
1
2
3
#sorted() Function 临时性排序
sorted(names)
#降序也需要传递reverse参数
1
2
#reverse() Method 永久性反转列表元素
names.reverse()
1
2
#len() Function 获得列表长度
len(names)
1
2
3
4
#任何时候都可以使用-1索引访问列表最后一个元素,除了空列表
names[-1]
#实际上用负数会从列表尾部开始访问
names[-2]

列表操作

1
2
3
#for循环,传值而非引用,所有代码块靠缩进确定范围
for name in names:
print(name)
1
2
3
4
5
6
7
8
#range() Function 生成一系列数字,比如 1 到 8 - 1 的所有整数
for val in range(1, 8):
pirnt(val)
#range() Function 生成列表,这个列表包含 1 到 8 - 1 的所有整数
numbers = list(range(1, 8))
#range() Function 制定生成数字之间的步长,下面步长是2
odd_numbers = list(range(1, 11, 2))
#1, 3, 5, 7, 9
1
2
3
4
5
6
#min() Function 返回列表最小值
min(numbers)
#max() Function 返回列表最大值
max(numbers)
#sum() Function 返回列表元素值总和
sum(numbers)
1
2
#使用列表解析创建列表,下面的创建了一个 2 到 28 的所有偶数
double_nums = [val * 2 for val in range(1, 15)]
1
2
3
4
5
6
7
8
#使用切片获得列表的一部分,比如下面是索引 1 到 3 - 1 的子列表
sub_numbers = numbers[1:3]
#从索引 0 到 4 - 1 的子列表
sub_numbers = numbers[:4]
#从索引 1 到最后的子列表
sub_numbers = numbers[1:]
#最后三个的子列表
sub_numbers = numbers[-3:]
1
2
3
4
#复制列表需要如下:
copy_numbers = Numbers[:]
#直接赋值名字是传引用
refer_numbers = Numbers
1
2
#元组是不可变的列表,用小括号初始化
dimensions = (100, 20)
1
2
3
#元组虽不可修改,但可以重新赋值
dimensions = (120, 15)
dimensions = (140, 25)

if语句

1
2
3
4
if name = 'Chris':
print(name)
else:
print('Error')
1
2
3
#and, or替代了&& 和 ||
age > 12 and age < 20
age_1 > 14 or age_2 > 14
1
2
3
4
5
#in 关键字也可以用来判断列表是否包含某值
isThereACat = 'cat' in animals
#加上not 就可以表否定
if 'cat' not in animals:
print('Not here')
1
#True 和 False 首字母大写
1
2
3
4
5
6
7
#elif
if age < 4:
#do somthing
elif age < 8:
#do something
else:
#do something
1
2
3
#列表名本身作判断条件是代表其是否为空
if names:
print('Not Empty')

字典

1
2
3
4
#大括号表字典,其中value值可以在同一个字典中为各种不同类型
#实际上key类型也可以为几种不同的基本类型,但是像字典这种就不能作为key了
#而字典和列表是可以作为value的
student = {'Name':'Hoy', 'Scores':92}
1
2
3
#添加新的键值对,直接新的键赋值就行
#修改值也是相同的操作
student['Gender'] = 'Male'
1
2
#使用del 关键字删除字典中元素
del student['Gender']
1
2
3
4
5
6
7
8
9
10
11
12
13
#遍历字典,items() Method 返回键值对列表
#遍历顺序和存储顺序可能不一样
for k, v in student.items():
print(k, v)
#keys() Method 只返回key的列表
for k in student.keys():
print(k)
#按顺序遍历key值
for k in sorted(student.keys()):
print(k)
#values() Method 只返回value的列表
for v in student.values():
print(v)
1
2
3
#使用set存储元素不重复的集合
for uv in set(student.values()):
print(uv)

用户输入和while循环

1
2
3
4
#input() Function 的参数是提示信息,接下来用户输入以回车结束
#input() 返回的是输入的字符串
message = input("Please input something")
print(message)
1
2
3
4
#int() Function 将数字的字符串表示转换为数值表示
#复习:与之相反的是str() Function
age = input("Your age")
age = int(age)
1
2
3
4
5
#while循环
counter = 5
while counter > 0:
#do something
couter -= 1
1
2
3
4
#删除包含特定值的所有列表元素
#in关键字可以作为布尔表达式
while 'cat' in pets:
pets.remove('cat')

函数

1
2
3
#关键字def创建函数
def func1(num):
print("This is a function")
1
2
3
#传递实参可以通过位置实参,即传统的传递方式
#也可以通过关键字实参,那么其位置无关紧要,如下
func1(num=biggerNum)
1
2
3
4
#参数可以通过赋值指定默认值,实参则可以改变它
#指定了参数默认值的函数可以不需要提供对应实参
def func2(age=18):
print(age)
1
2
3
#函数不需要指定返回类型,可以有也可以没有return
def func3(tag):
return tage + 1
1
2
3
4
5
#传递切片从而传递列表的拷贝,使函数不会改变远来的列表
def func4(names):
for name in names:
name += "'s"
func4(names[:])
1
2
3
4
5
#传递任意数量的实参
def func5(*coes):
for coe in coes:
print(coe)
#*号创建一个名为coes的元组,所有实参都在里面
1
2
3
4
#传递未知数量未知作用的实参,通过**创建字典
def func6(**dic):
for k, v in dic.items():
print(k, v)
1
2
3
4
5
6
7
8
9
#导入文件,需要用点语法调用其函数
import filename
#或只导特定函数,不需要点语法调用这个函数
from filename import funcname
#用as指定别名
from filename import funcname as fn
import filename as f
#使用*导入所有函数,则不需要点语法调用所有函数
from filename import *
1
#函数命名应该只有小写字母和下划线

1
2
3
4
5
6
7
8
9
10
#class关键字用来创建类,类名应该首字母大写
class Dog():
def __init__(self, name, age):
#do initialization
self.name = name
self.age = age
#指定属性的默认值
self.legs = 4
def func1(self):
#do something
1
2
#__init__() Method 是必不可少的
#初始化函数形参self是必不可少的
1
2
3
#属性是在初始化方法中创建的,没有一个单独的属性列表
#可以通过类实例的点语法访问其属性
#可以通过点语法修改属性,但最好创建一个修改的方法
1
2
3
4
5
6
7
#继承,括号参数里是父类
#初始化方法调用父类初始化方法
class whiteDog(Dog):
def __init__(self, name, age):
super().__init__(name, age)
#子类特有的属性
self.color = 'white'
1
2
#重写(Override)父类的方法
#只需要相同的函数名再定义一次即可
1
2
#python大量的外部库可以参考
#Python Module of the Week

文件和异常

1
2
3
4
#open() Function 接受一个文件名称作为参数
#返回一个表示该文件的对象
file_obj = open('bigdata.txt')
#该文件应在当前执行文件的相同文件夹内
1
2
3
#close() Method 可以关闭对象所对应的文件
file_obj.close()
#一定要在文件不使用之后进行关闭
1
2
3
4
#为了避免可能无法正常关闭文件,使用如下
with open('bigdata.txt') as file_obj:
#do something
#则由语言本身负责在恰当时候关闭文件
1
2
3
#read() Method 以字符串形式返回文件内容
contents = file_obj.read()
#在contents尾部会多一个空行,这是读到末尾返回的
1
2
3
#删除内容末尾的空行可以使用rstrip() Method
contents = contents.rstrip()
#之前提到过rstrip()是临时的
1
2
3
4
5
#当文件不在当前文件夹时,用绝对路径
file_path = '/home/projects/example/bigdata.txt'
with open(file_path) as file_obj:
#do something
#在windows中/需要换成\
1
2
3
4
5
#逐行读取内容
with open(file_path) as file_obj:
for line in file_obj:
#do something
#而在上面line中都包含一个换行符,需要用rstrip() Method 删除
1
2
#readlines() Method 返回文件对象的一个列表,每个元素是一行
lines = file_obj.readlines()
1
2
3
#可以用in关键字判断某个子串是否在字符串中
if 'dfs' in str:
#do something
1
2
3
4
5
#open() Function 的默认第二个参数是'r',也就是读模式
#传'w'作为第二个实参,可以写入文件
with open('bigdata.txt', 'w') as file_obj:
file.obj.write("writing")
#write() Method 用来写入
1
2
3
#如果要写入的文件不存在则write() Method 会创建一个新文件
#如果已经存在,则会清空该文件
#write() 不会自动加换行符,需要自己添加
1
#附加模式即第二个参数为'a',则不会清空写入文件,而是添加到末尾
1
2
3
4
5
6
7
#异常处理语法
try:
#do something
except ThisIsAnError:
#address the error
else:
#if no error do this
1
2
3
#split() Method 把一个字符串按空格分开创建一个列表
title = "make China great again"
words = title.split()
1
#pass 关键字可以让异常处理什么也不做
1
2
#导入json模版来处理数据
import json
1
2
3
4
5
#json.dump() Method 接受两个实参,要存储的数据以及文件对象
numbers = [4,3,5,8,4]
file_n = 'num.json'
with open(file_n) as f_obj:
json.dump(numbers, file_n)
1
2
3
4
#json.load() Method 接受文件对象作为实参
with open('bigdata.txt') as f_obj:
numbers = json.load(f_obj)
print(numbers)

测试代码

1
2
#unittest模块用来进行单元测试
import unittest
1
2
3
4
5
6
7
8
9
10
11
#用一个继承unittest.TestCase的类进行单元测试
import unittest
from name_function import get_formatted_name

class myTestCase(unittest.TestCase):
def test_first_last_name(self):
formatted_name = get_formatted_name('janis', 'jopin')
self.assertEqual(formatted_name, 'Janis Joplin')

unittest.main()
#测试类中所有test_开头的方法都会被自动运行
1
2
#测试类
#和上面测试函数差不多
1
#unittest.TestCase的setUp()方法可以重写用来只创建一次类对象