记录python基础知识,备用
资料:《python编程 从入门到实践》
变量
变量名只能包含字母、数字和下划线。以字母或下划线开头
注释
使用#
号
基本数据类型
- 字符串
各种方法:
str.title() // 以首字母大写的方式显示每个单词
str.upper() // 转为全大写字母
str.lower() // 转为全小写字母
str.rstrip() // 删除字符串末尾
多余的空白,ps: 原字符串没有改变,除非重新赋值: str=str.rstrip()
str.lstrip() // 删除字符串开头
多余的空白
str.strip() // 删除字符串开头
和结尾
多余的空白 - 数字
- 整数
python3中:整数除法( /)保留小数部分,// 才是向下取整
python2中,整数除法的结果只包含整数部分,小数部分被删除(并且非四舍五入),避免这种结果的方法:将其中一个数转为浮点类型 - 浮点数
与其他语言一样,浮点数的运算会存在误差问题 - 使用str()函数避免类型错误
age = 12
str(age) // ‘12’
- 列表
- 列表由一系列
按特定顺序排列
的元素组成。列表使用方括号[]表示。索引从0开始。最后一个元素可以使用-1
访问。 - 修改列表
list[0] = ‘hello’ - 在列表末尾添加元素
list.append(‘hello’) - 在列表中插入元素
list.insert(0, ‘hello’) // 此例插入到第一个前面,即开头 - 从列表中删除元素
del list[0]
或list.pop()
// 删除列表末尾的元素,并让你能接着使用它
例: a = list.pop() print(a) // 可以输出东西
list.pop(0)
// pop()可以用来删除列表中任意位置的元素
remove()
// 如果只知道要删除的元素的值,可以使用方法remove(),注意remove只删除第一个指定的值,如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。 - 使用sort()方法可以对列表进行
永久
性排序
cars.sort(reverse=True) // 降序 - 使用sorted()方法对列表进行
临时
排序 - 使用reverse()
永久
性翻转列表 - 列表长度: len(list)
- 遍历列表
for car in cars:
print(car)
- 创建数值列表
for value in range(1,5):
print(value) // 1 2 3 4
可以使用函数list()将range()的结果直接转换为列表
numbers = list(range(1,6))
// [1,2,3,4,5]
even_numbers = list(range(2,11,2)) // 范围[2,11),步长为2
// [2,4,6,8,10]
- 对数字列表执行简单的统计计算
min(list) // 最小值
max(list) // 最大值
sum(list) // 总和 - 列表解析
squares = [value**2 for value in range(1,11)] // 1,4,9,16,25,36,49,64,81,100 - 使用列表的一部分
print(list[0:3]) // list[0],list[1],list[2]
print(list[:3]) // list[0],list[1],list[2]
print(list[-3:]) // 倒数第三位开始直至末尾元素
复制列表
list_copy = list[:] // 此处list_copy和list为两个值相同的不同列表
- 元组
- 不可变的列表被称为元组。元组使用圆括号。
- 虽然不能修改元组的元素,但可以给存储元组的变量重新赋值。
- 字典
- 在python中,字典是一系列键-值对。每个键都与一个值相关联,你可以使用键来访问与之相关联的值。与键相关联的值可以是数字、字符串、列表乃至字典。字典不关心
顺序
。 - 字典和列表可以相互嵌套。
alien = {'color': 'red', 'points': 5}
print(alien['color']) // red
- 添加、修改键-值对
alien['x_position'] = 1
- 删除键-值对
del alien['color']
- 遍历字典
for key, value in alien.items():
print(key)
print(value)
// 遍历所有的键
for key in alien.keys():
print(key)
// 按顺序遍历字典中的所有键
for key in sorted(alien.keys()):
print(key)
// 遍历字典中的所有值
// 使用values()方法
// 考虑值可能出现重复问题,使用set()方法
for value in set(alien.values()):
print(value)
if语句
if age < 10:
print(age+10)
elif age < 12:
print(age+20)
else:
print(age)
while循环
while age > 10 :
age--
python可以使用break和continue语句
用户输入
- 用户输入input()函数
// 用户输入存储到message中
message = input('input your message: ')
- 使用int()来获取数值输入
age = input("how old are you? ")
age = int(age)
- python2.7使用函数raw_input()来提示用户输入。
函数
- 使用def定义函数
def greet_user():
print("hello~~")
- 位置实参和关键字实参
位置实参: 参数调用顺序十分重要
关键字实参: greet_user(user_name=‘henry’, pet_name=“ricky”) // 此处形参名字为user_name和pet_name - 参数默认值
def greet_user(pet_name, user_name="passerby"):
print('hello, '+user_name+'hello, '+ pet_name)
greet_user(pet_name="ricky") // 此处user_name使用默认值
greet_user('ricky') // pet_name = 'ricky'
- 传递列表
使用列表传参 names=[‘you’,‘me’,‘he’] - 在函数中修改列表
ps: 在函数中对列表参数的所做的任何修改都是永久性的。 - 禁止函数修改列表
向函数传递副本
print_func(names[:]) // 传递列表names的副本
- 传递任意数量的实参
def make_pizza(*toppings):
print(toppings)
make_pizza('hello') // ('hello')
make_pizza('hello','hi') // ('hello','hi')
形参名*toppings中的星号让python创建一个名为toppings的空元组(不可修改的列表未元组),并将收到的所有值都封装到这个元组中。
- 结合使用位置实参和任意数量实参
def make_pizza(size, *toppings)
print("\nMaking a "+str(size)+"-inch pizza with the following toppings:")
for topping in toppings:
print("- "+topping)
make_pizza(16,'h','t','j')
- 使用任意数量的关键字实参
def build_profile(first, last, **user_info):
profile={}
profile['firstname'] = first
profile['lastname'] = last
for key, value in user_infp.items():
profile[key] = value
return profile
user_profile = build_profile('albert','einstein',location=''princeton',field='physics')
print(user_profile)
- 将函数存储在模块中
// 首先在pizza.py定义函数make_pizza
// 在making_pizzas.py中import
import pizza
pizza.make_pizza(16,'hello')
- 导入特定函数
from module_name import function_name1, function_name,...
例如
from pizza import make_pizza
make_pizza(16, 'hello')
- 使用as给模块指定别名
import pizza as p
p.make_pizza(16,'hello')
- 导入模块中的所有函数
from pizza 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!")
- 根据约定,在python中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。
__init__()
是一个特殊的方法,创建实例时会自动运行。self是一个指向实例本身的引用,让实例能够访问类中的属性和方法。- 根据类创建实例
my_dog = Dog('Alex', 6) // 方法__init__()并未显式地包含return语句,但python自动返回一个表示这条小狗的实例。我们将这个实例存储在变量my_dog中。
print("My dog's name is "+my_dog.name.title() + ".") // 访问属性
my_dog.sit() // 调用方法
- 修改属性的值
① 直接修改
my_dog.age = 8
可以这么做,但个人认为是很危险的做法。
② 通过方法修改
- 继承
编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
class Animal():
def __init__(self, age, name):
self.name = name
self.age = age
def run(self):
print("The animal is running.")
class Dog(Animal):
def __init__(self, age, name):
super().__init__(age, name)
self.type = 'dog' #子类自己的属性
# 子类可直接重写父类的方法
print("The dog is running.")
- 导入类
导入单个类 from car import Car
导入多个类 from car import Car, ElectricCar
导入整个模块 import car
导入所有类 from car import *
文件和异常
- 读取整个文件
# 关键词with在不再需要访问文件后将它关闭
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
# read()到达文件末尾时返回一个空字符串,而将这个空字符串显示出来就是一个空行。
# 要删除末尾的空行,可在print语句中使用rstrip()
# print(contents.rstrip())
- 逐行读取
with open(filename) as file_object:
for line in file_object:
print(line.rstrip())
- 创建一个包含文件各行内容的列表
with open(filename) as file_object:
lines = file_object.readlines()
for line in lines:
print(line.rstrip())
- 写入文件
① 写入空文件,如果你要写入的文件不存在,函数open()将自动创建它。然而,以写入(‘w’)模式打开文件时千万要小心,因为如果指定的文件已经存在,python将在返回文件对象前清空该文件。
with open(filename, 'w') as file_object:
file_object.write("helloworld")
ps:python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。
② 写入多行
使用换行符‘\n’
③附加到文件
以附加模式’a’打开文件
- 异常
使用try-except代码块
else代码块try: print(5/0) except ZeroDivisionError: print("you can not divide by zero!")
try: answer = int(first) / int(second) except ZeroDivisionError: print("you can not divide by zero!") else: print(answer)
- 处理FileNotFoundError异常
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
print("Error!")
except中可以使用pass语句,什么都不做
- 存储数据——json
使用json.dump()和json.load()
import json
numbers = [1,2,3,4,5,6,7]
filename = "numbers.json"
with open(filename, 'w') as file_obj:
json.dump(numbers, file_obj) # 存储到文件中
import json
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj) #读取文件内容
测试代码
- 测试函数
要为函数编写测试用例,可先导入模块unittest以及要测试的函数,再创建一个继承unittest.TestCase类,并编写一系列方法对函数行为的不同方面进行测试。
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
def test_first_last_name(self): # 测试方法必须以test_开头
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
unittest.main()
测试不通过则修改被测试函数,直至通过
各种断言方法
方法 | 用途 |
---|---|
assertEqual(a,b) | 核实a==b |
assertNotEqual(a,b) | 核实a!=b |
assertTrue(x) | 核实x为true |
assertFalse(x) | 核实x为false |
assertIn(item, list) | 核实item在list中 |
assertNotIn(item, list) | 核实item不在list中 |
- 测试类
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.response)
unittest.main()
使用方法setUp()
之前我们在每个测试方法中都创建了一个AnonymousSurvey实例,并在每个方法中都创建了答案。unittest.TestCase类包含方法setUp(),让我们只需创建这些对象一次,并在每个测试方法中使用它们。如果你在TestCase类中包含了方法setUp(),python将先运行它,再运行各个以test_打头的方法。这样,在你编写的每个测试方法中都可使用在方法setUp()中创建的对象了。
import unittest
from survey import AnonymousSurvey
class TestAnonymousSurvey(unittest.TestCase):
def setUp(self):
question = "What language did you first learn to speak?"
self.my_servey = AnonymousSurvey(question)
self.response = ['English', 'Spanish', 'Mandarin']
def test_store_single_response(self):
self.my_survey.store_response(self.response[0])
self.assertIn(self.response[0], self.my_survey.responses)
def test_store_three_response(self):
for response in self.responses:
self.my_survey.store_response(response)
for response in self.responses:
self.assertIn(response, self.my_survey.responses)