Python笔记
主要是记录一些和C++里不一样的以及我不知道的
变量的定义
message=”hello, world!”
字符串
- 单引号,双引号都可以,这样就可以自由得在字符串中包含双引号单引号啦
-
message.title()
会返回Hello, World!
(原字符串并不改变)
全部大写/小写.upper/lower()
- 用
+
拼接 -
\t
制表符,\n
换行 - 返回删除字符串末尾/开头/开头与末尾的多余空白后的字符串:
.rstrip()/.lstrip()/.strip()
(常用于在存储用户输入前对其进行清理) - 像matlab一样终端可以当计算器用,按回车输出结果
- 2^3要写成
2**3
- 转为字符串
str(23)
- 判断一个字符串是否是另一个字符串的子串可以直接
if a in b:
列表
- 在列表中添加元素
xxs.append(x)
- 插入元素
xxs.insert(0, x)
- 删除元素
del xxs[0]
- 删除的同时获取
x=xxs.pop(0) #不写参数的时候就是默认删去最后一个元素
- 根据值删除
xxs.remove(x)
注:如果x有重复的remove只删去第一个,可以配合循环来使用
永久性排序 -
xxs.sort()
xxs.sort(reverse=True)
- 临时性排序
sorted(xxs)
sorted(xxs, reverse=True)
- 反转
xxs.reverse()
- 长度
len(xxs)
- 创建数值列表
digits=list(range(2, 11, 2))
->[2, 4, 6, 8, 10]
min(digits)/max/sum
- 列表解析将for循环和创建新元素的代码合成一行,并自动附加新元素
squares=[value**2 for value in range(1, 11)]
- 切片
digits[0:3]==digits[:3]
digits[-3:]
- 复制列表
digits2=digits[:]
digits2=digits
(这样不行,这样只是让digits2关联到包含在digits中的列表) - 根据一个字符串创建单词列表
string.split()
元组
不可变列表
dimensions=(200, 50)
虽然元组内的元素不可以修改但可以给存储元组的变量重新赋值
条件判断
if a>b and a>c:
if a>b or a<c:
if x in xxs:
if x not in xxs:
if-elif-elif(-else)
- 确定列表是否为空
if xxs:
字典(无序)
alien_0={‘color’: ‘good’, ‘points’: 5}
print(alien[‘color’])
- 添加键值对
alien_0[‘x_position’]=0
- 创建空字典
alien_0={}
- 修改字典中的值
alien_0[‘color’]=’yellow’
- 删除键值对
del alien_0[‘points’]
- 遍历所有键值对
for k, v in user_0.items():
- 遍历所有键
for k in user_0.keys():
/for k in user_0:
.keys()
方法返回一个列表
if k1 not in user_0.keys():
- 按顺序遍历字典中的所有键
for k in sorted(user_0.keys()):
- 遍历所有值
for v in user_0.values():
返回所有值组成的列表 - 剔除重复元素
for v in set(user_0.values())
- 字典可以作为列表的元素
列表也可以作为字典的值
字典也可以作为字典的值 - 记录了键值对顺序的字典
from collections import OrderedDict
my_dict=OrderedDict()
输入
message=input(‘please input your name:’)
注意返回的是字符串,可以用int()转为数字
注意python2中是raw_input(如果用input的话用户输入会被视为python代码并被执行)
while循环
while n<5:
也可以用break, continue
函数
def 函数名(参数):
“””文档字符串”””
python会用这个生成程序中函数的文档
-
传递实参的多种方式
human(‘alice”, 18)
human(name=’alice’, age=18)
也可以在编写函数的时候给形参指定默认值
注意在形参列表中必须先列出没有默认值的形参 -
注意在函数中对传过去的参数进行修改的话参数本身是会被改变的,这跟c++不一样
(所有类型的参数还是只有列表?) -
禁止函数修改列表
function_name(list_name[:])
切片表示法创建副本还挺耗时的非必要的时候尽量不用 -
传递任意数量的实参
预先不知道要接收多少个实参的情况,python允许函数从调用语句中收集任意数量的实参
def make_pizza(*toppings):
print(toppings)
make_pizza(‘pepperoni’)
make_pizza(‘mushrooms’, ‘green pepper’, ‘extra chess’)
*
让python创建一个空元组,并将收到的所有值都封装到这个元组中
注意这种类型的形参应该放在最后
def make_pizza(size, *toppings):
- 接收任意数量的实参,且预先不知道传递给函数的是代表什么的信息
传递任意数量的键值对
def build_profile(first, last, **user_info):
build_profile(‘albert’, ‘einstein’, location=’princeton’, filed=’physics’)
**
让python创建一个空字典
- 将函数存储在模块中
模块是名为.py
的文件
比如pizza.py
同一个文件夹下
import pizza
pizza.make_pizza()
导入特定函数
from module_name import function_name1, function_name2
调用时直接function_name()
指定别名
from pizza import make_pizza as mp
mp()
模块也可以指定别名
导入模块中所有函数,这样也是直接用函数名来调用的(使用非自己编写的大型模块使最好别这样,容易重名)
from module_name import *
类
class Dog():
“””模拟小狗”””
def _init_(self, name, age):
self.name=name
self.age=age
def sit(self):
print(self.name.title()+” is now sitting.”)
def roll_over(self):
print(self.name.title()+” rolled over!”)
每当根据Dog类来创建新实例时,都会自动运行_init_()
_init_
的形参中self
必不可少且位于最前面创建实例时自动传入,它是指向实例本身的引用
以self
为前缀的变量可以被类的所有方法使用
python2中,class ClassName(object)
,这样类的行为就会比较像python3了
-
创建实例
my_dog=Dog(‘willie’, 6)
-
继承
Class ElectricDog(Dog):
def _init_(self, name, age, power):
“””初始化父类属性”””
super()._init_(name, age)
self.power=power
- python2中的继承
Class Dog(object):
Class ElectricDog(Dog):
def _init_(self, name, age, power):
super(ElectricDog, self)._init_(name, age)
-
重写父类的方法
直接同名函数覆盖就行 -
类也可以保存在模块中dog.py使用方法和上面的把函数存在模块里一样
from dog import Dog
文件
- 读取整个文件
pi_digits.txt与使用它的.py文件在同一个目录下
with open(‘pi_digits.txt’) as file_object:
contents=file_object.read()
print(content)
关键字with
会在不需要访问文件后将其关闭(如果使用close()
来关闭的话,可能会出现程序在执行close语句前出了bug文件关不了的情况)
read()
到达文件末尾时返回一个空字符串,会在原文件末尾多一个空行(要删除空行可使用rstrip()
)
- 文件路径
不在同一个目录下的时候要提供路径
1.相对于当前运行的程序所在目录
比如程序在python_work中,文件在python_work的子文件text_files中
Linux/OS X
open(‘text_files/filename.txt’)
Win
open(‘text_files\filename.txt’)
2.绝对路径
Linux/OS X
file_path=’/home/ehmatthes/other_files/text_files/filename.txt’
open(file_path)
Win
file_path=r’C:\Users\ehmatthes\other_files\text_files\filename.txt’
(因为\在python中是转义标记所以要加上r使其变成原始字符串)
open(file_path)
- 逐行读取
以每次一行的方式检查文件可对文件对象使用for循环
with open(filepath) as file_object:
for line in file_object:
print(line)
不过这样每行后面都会多一个空行
- 创建一个包含文件各行内容的列表
(使用with关键字的时候文件对象file_object只在with代码块中可用)
with open(filepath) as file_object:
lines=file_object.readlines()
- 写入文件
with open(‘filename.txt’, ‘w’) as file_object:
file_object.write(“I love programming”)
‘w’
写入模式,若文件不存在会自动创建,若存在会将原文件清空再返回
‘r’
读取模式,默认
‘a’
附加模式,若文件不存在会自动创建,若存在会在原文件的末尾开始写
‘r+’
读写模式
只能将字符串写入文本文件,其它数据格式要用str进行转换
异常
python使用被称为异常的特殊对象来管理程序执行期间发生的错误
发生错误时会创建一个异常对象,如果有处理该异常的代码程序(try-except)就可以继续执行否则就会停止并显示一个traceback
try:
print(5/0)
except ZeroDivisionError:
print(“You can’t divide by zero”)
这样遇到ZeroDivisionError的时候就会打印这句话而不是出现traceback
然后程序会继续执行
try:
answer=int(first_num)/int(second_num)
except ZeroDivisionError:
print(“You can’t divide by zero”)
else:
print(answer)
FileNotFoundError
ValueError
也可以在except中使用pass
使用json模块来存储数据(不局限于字符串,各种数据结构都可以)
import json
numbers=[2, 3, 5, 7, 11, 13]
filepath=’number.json’
with open(filepath, ‘w’) as f_obj:
json.dump(numbers, f_obj)
读取数据
with open(filepath) as f_obj:
numbers=json.load(f_obj)
示例:
import json
filepath=’username.json’
try:
with open(filepath) as f_obj:
username=json.load(f_obj)
except FileNotFoundError:
username=input(“What is your name?”)
with open(filepath, ‘w’) as f_obj:
json.dump(username, f_obj)
else:
print(“Welcome back, “+username)
使用Python模块unittest中的工具来测试代码
自动执行,并使用断言来判断执行得是否正确
单元测试用于核实函数的某个方面没有问题
测试用例是一组单元测试,核实函数在各种情形下都没问题
全覆盖式测试用例
- 测试函数
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’)
def test_first_last_middle_name(self):
“””测试另一种情况”””
formatted_name=get_formatted_name (‘wolfgang’, ‘mozart’, ‘amadeus’)
self.assertEqual(formatted_name, ‘Wolfgang Amadeus Mozart’)
unittest.main()
运行这个文件时,所有test_开头的方法都会被自动运行
用断言方法来核实结果是否与期望的结果一致
assertEqual(a, b)
assertNotEqual(a, b)
assertTrue(x)
assertFalse(x)
assertIn(item, list)
assertNotIn(item, list)
- 测试类
survey.py
class AnonymousSurvey():
def _init_(self, question):
self.question=question
self.responses=[]
def show_question(self):
print(self.question)
def store_response(self, new_response):
self.responses.append(new_response)
def show_results(self):
print(“Survey results:”)
for response in self.responses:
print(‘- ‘+response)
test_survey.py
import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
def test_store_single_response(self):
question=”What language did you first learn to speak?”
my_survey=AnonymousSurvey(question)
my_survey.store_response(‘English’)
self.assertIn(‘English’, my_survey.responses)
unittest.main()
不用在每个方法中都创建实例,可以使用unittest.TestCase类中的setUp方法,只需创建实例一次并在每个测试方法中使用
setUp方法在test_方法之前调用
import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
def setUp(self):
question=”What language did you first learn to speak?”
self.my_survey=AnonymousSurvey(question)
self.responses=[‘English’, ‘Spanish’, ‘Mandarin’]
def test_store_single_response(self):
self.my_survey.store_response(self.responses[0])
self.assertIn(self.responses[0], self.my_survey.responses)
def test_store_three_responses(self):
for response in self.responses:
self.my_survey.store_response(response)
for response in self.responses:
self.assertIn(response, self.my_survey.responses)
unittest.main()