python规范

  • 函数必须写注释:文档注释格式'''注释内容'''
  • 参数中的等号两边不要用空格
  • 相邻函数用两个空行隔开
  • 小写 + 下划线
    1. 函数名
    2. 模块名
    3. 实例名
  • 驼峰法
    1. 类名

tips

  1. # 一行代码太长,使用\折行
  2. if xx and xxx and \
  3. xxx and xxx
  1. # 获取对象内存
  2. import sys
  3. sys.getsizeof(f)

变量和数据类型

字符串

结构化类型,有一系列的属性和类型

库函数

  1. # 不会影响原来的变量,需要改变则需用变量接受返回值
  2. string.title() # 首字母大写,其余小写
  3. string.upper() # 全大写
  4. string.lower() # 全小写
  5. string.rstrip() # 仅删除末尾空格
  6. string = string.rstrip()
  7. string.lstrip() # 仅删除开头空格
  8. string.strip() # 删除首尾空格,中间的不删
  9. string.split(' ', num) # 以空格为分隔符,分隔num+1个,默认分隔所有

相关语法

  1. # 字符串拼接
  2. string = str1 + "hello"
  1. # r-string 非转义
  2. print(r'\t') # output:\t

格式化

  1. # % 格式化
  2. 'i am %s, and he is %s' % (my_name, his_name)
  1. # format + 占位符 格式化
  2. 'i am {0}, and he is {1}'.format(my_name, his_name)
  3. # 抑或
  4. 'i am {my_name}, and he is {his_name}'.format(my_name='li', his_name='wang')
  5. # 也可混用
  6. 'i am {}, and he is{his_name}, we like to {}'.format(my_name, work, his_name='li')
  1. # f-string
  2. f'i am {my_name}, and he is {his_name}'

数字

标量类型,此对象无可访问的内部对象

  1. # +-*/ <-> 加减乘除
  2. # ** <-> 乘方

python中,整型相除默认是浮点型

基础语法

if 语句

  1. # 检查特定值
  2. arr = ['a', 'b', 'c']
  3. if 'dd' not in arr:
  4. print('no')
  1. # if - elif - else
  2. age = 40
  3. if age < 12:
  4. print("you are baby")
  5. elif age < 18:
  6. print("you are young")
  7. else:
  8. print("you are adult")

建议:使用elif代替else

循环结构

for - in

  • range(101):可以用来产生0到100范围的整数,需要注意的是取不到101。
  • range(1, 101):可以用来产生1到100范围的整数,相当于前面是闭区间后面是开区间。
  • range(1, 101, 2):可以用来产生1到100的奇数,其中2是步长,即每次数值递增的值。
  • range(100, 0, -2):可以用来产生100到1的偶数,其中-2是步长,即每次数字递减的值。

while

  1. num = 1;
  2. while num <= 5:
  3. print(num)
  4. num += 1
  1. # 字符串while交互
  2. prompt = '\nTell me someting, and I will repeat it back to you:'
  3. prompt += "\nEnter 'quit' to end the program:"
  4. message = ""
  5. while message != 'quit':
  6. message = input(prompt)
  7. if message != 'quit':
  8. print(message)

input - 输入

  1. # input返回的结果是输入的内容,括号里的参数是字符串,可以显示在终端
  2. age = input("请输入年龄:")
  3. age = int(age)
  4. print("你的年龄是:" + str(age))

print - 输出

  1. # 占位符格式 %
  2. a, b = 3, 4
  3. print('a=%d, b=%d' % (a, b))
  4. print('a=%d' % a) # 如果是一个参数,不需要括号
  1. # 格式化输出
  2. # %f 浮点,%s 字符串
  3. print('%.1f华氏度 = %.1f摄氏度' % (a, b))
  4. print(f'{f:.1f}华氏度 = {c:.1f}摄氏度') # 字符串前加f表示格式化字符串
  5. # 输出字符串/数字
  6. a, b = '5', '10'
  7. print('{0} + {1} = {2}'.format(a, b, a+b))
  8. print(f'{a} * {b} = {a * b}')

函数

函数名加括号就行执行,函数名不加括号就能传递

定义

  1. # 如果不想在本文件导出时,执行本函数,则写成下面的形式
  2. def main():
  3. # Todo: Add your code here
  4. pass
  5. if __name__ == '__main__':
  6. main()
  7. # 如果代码在本文件中执行,则__name__的值为'__main__',否则为文件名

传递实参

  1. # 位置实参:实参与形参位置需要对应
  2. # 关键字实参
  3. def func(par1, par2):
  4. print(par1 + ' ' + par2)
  5. func(par2 = 'name', par1 = 'my')
  6. # 指定默认值
  7. def func(par1, par2 = 'look'):
  8. print(par1 + ' ' + par2)
  9. func(par1 = 'let me') # 也可func('let me') 【仅限末尾的形参已有默认值】
  1. # 切片可以创建列表副本
  2. def function(cats[:]): # 则函数不会修改原来的cats列表
  1. # 传递任意数量实参 - cat 变为元组,无论是一个参数,两个参数还是没有参数
  2. def function(*cat):
  3. print(cat)
  4. function('a', 'aa', 'b')
  1. # 创建一个传任意参数的字典
  2. def build_profile(**info):
  3. profile = {}
  4. for key, val in info.items():
  5. profile[key] = val
  6. print(profile)
  7. build_profile(name = 'liming', age = 24, edu = '兰大')

导入模块

  1. # 导入module.py
  2. import module
  3. # 调用module中func函数
  4. mode.func()
  5. # 仅调入某函数
  6. from module_name import function_name1, function_name2
  1. # as 给函数指定别名
  2. from module import old_name as new_name
  3. # as 起模块起别名
  4. import module as m
  1. # 导入模块所有函数【不建议使用】
  2. from module import * # 此时调用函数时无需使用句号表示法

python同名函数或变量会进行覆盖

异常

异常 - Error

  1. try:
  2. # 代码块
  3. except errorType:
  4. # 出现异常执行代码块
  5. else:
  6. # 未出现异常执行代码块
  7. finally:
  8. # 不论怎样都会执行代码块
  1. # 统计文件字数
  2. def count_words(filename):
  3. try:
  4. with open(filename) as f_obj:
  5. contents = f_obj.read()
  6. except FileNotFoundError:
  7. msg = filename + " can't found"
  8. print(msg)
  9. else:
  10. words = contents.split()
  11. num_words = len(words)
  12. print("The file " + filename + " has about " + str(num_words) + " words.")
  13. filenames = ['guest.txt', 'a.txt', 'b.txt']
  14. for filename in filenames:
  15. count_words(filename)
  1. # 遇到异常时,不反馈
  2. except errorType:
  3. pass

数据类型

存储成组的信息,类似于数组,但可以容纳不同的类型的元素

列表

初始化

  1. # 声明与初始化
  2. bicyles = ['trek', 'annondale', 'redline']
  3. print(bicyles) # 访问所有元素
  4. print(bicyles[0]) # 访问单个元素
  5. # 创建二维列表
  6. a = [[0] for _ in range(m)] for _ in range(n)
  7. print(a)

索引对应关系

  1. list1 = [1, 2, 3, 4]
  2. # index 0 1 2 3
  3. # index -4 -3 -2 -1

增删

  1. # 在列表中添加元素
  2. list2 = [1, 2, 3, 4]
  3. list2.append(5) # 末尾
  4. List2.insert(0, 10) # 索引+数值,插入元素
  5. # 删除元素
  6. del list2[1] # 按索引删除
  7. list2.pop() # 默认从末尾删,也可在括号内指定索引,返回值是删除的元素
  8. list2.remove(3) # 按值删除(只会删除第一次出现的值),返回值是空
  9. del list1 # free list1
  10. list1.clear() # 清空list1中元素

关于remove

  • 如果remove的元素不在list中,可编译
  • remove的元素类型与list中的元素类型不匹配时,会报错

关于insert

  • 不会因为索引超出范围而报错,超出范围:正数-末尾;负数-开头
  • index = -1,则会插入到倒数第二个位置,-2同理

排序

  1. # 永久性排序
  2. list1.sort() # 升序
  3. list1.sort(reverse = True) # 降序(注:python中的True,T要大写)
  4. # 临时性排序
  5. print(sorted(list1)) # 只能按sorted中的列表顺序正序排列

list中有不同类型的元素,排序会报错

求表长

  1. length1 = len(list1)
  2. # 二维列表a
  3. row = len(a)
  4. col = len(a[0])

逆置

  1. list1.reverse() # 永久性的

其余注意事项

  • 列表为空时,index = -1 会出错

操作列表

遍历列表

  1. for cat in cats:
  2. print(cat)
  3. for i in range(len(cats)):
  4. print(cats[i])
  5. for i, item in enumerate(cats):
  6. print(i, item)

数值列表

  1. # range(a, b) [a, b) 默认从0开始
  2. for item in range(1, 5):
  3. print(item)
  4. # range 指定步长
  5. range(a, b, 2) # [a, b) 步长为2
  1. # range创建列表
  2. numbers = list(range(1, 6))
  3. print(numbers)
  1. # 统计数字列表
  2. max(digits)
  3. min(digits)
  4. sum(digits)
  1. # 1~10 的平方列表
  2. numbers = [number ** 2 for number in range(1, 11)]
  3. print(numbers)

切片

  1. # 切片 [ , )
  2. words = ['a', 'b', 'c', 'd']
  3. print(words[0 : 3]) # ['a', 'b', 'c']
  4. # 从第3个元素开始
  5. print(words[2 : ])
  6. # 输出前两个
  7. print(words[ : 2])
  8. # 输出最后三个
  9. print(words[-3 : ])
  10. # 中间三个
  11. index = int(len(words) / 2)
  12. print(words[index - 1:1 - index])
  13. # 复制列表(赋值引用 words和newWords指向同一地址
  14. newWords = words
  15. # 复制列表(赋值数值 words和newWords再无关联
  16. newWords = words[:]
  17. # 逆序输出
  18. newWords = words[::-1]

生成式和生成器

  1. # 生成器
  2. f = (x ** 2 for x in range(1, 1000)) # x是局部变量,作用域仅在()中
  3. for val in f:
  4. print(val)
  5. # 生成式 生成列表
  6. list_f = [x ** 2 for x in range(1, 1000)]
  1. # 相比于生成式需要的空间更少
  2. print(sys.sizeof(f)) # 120
  3. print(sys.sizeof(list_f)) # 9024
  1. # 生成器:内存更小,响应更快
  2. def square(n):
  3. for i in range(n):
  4. yield i ** 2
  5. for item in square(5):
  6. print(item)
  7. # 普通写法
  8. def square(n):
  9. arr = [x ** 2 for x in range(n)]
  10. return arr
  11. for item in square(5):
  12. print(item)

元组 - 不可变的列表

不可变的列表称为元组

在多线程环境中,相较于列表更加安全,更加高效

  1. # 定义元组
  2. dimensions = (1, 2, 3)
  3. print(dimensions[0])
  4. # tup1 = (50,) 仅包含一个元素时,需要在后面加逗号
  1. # 覆盖原有元组
  2. dimensions = (1, 2, 4)
  3. dimensions = (1, 2, 3)
  4. print(dimensions)
  1. # 元组转化为列表
  2. list1 = list(dimensions)

集合

不允许有重复元素,可进行集合的交并差运算

  1. # 创建集合的字面量语法 空集合必须用set创建
  2. set1 = {1, 2, 3, 3, 3, 2}
  3. print(set1)
  4. print('Length =', len(set1))
  5. # 创建集合的构造器语法(面向对象部分会进行详细讲解)
  6. set2 = set(range(1, 10))
  7. set3 = set((1, 2, 3, 3, 2, 1))
  8. print(set2, set3)
  9. # 创建集合的推导式语法(推导式也可以用于推导集合)
  10. set4 = {num for num in range(1, 100) if num % 3 == 0 or num % 5 == 0}
  11. print(set4)
  1. print('\n')
  2. set1.add(4)
  3. set2.update([11, 12]) # 添加元素
  4. set2.discard(5) # 删除元素
  5. if 4 in set2:
  6. set2.remove(4)
  7. print(set1, set2)
  8. print(set3.pop())
  9. print(set3)

字典

一系列键值对

初始化

  1. # 声明+初始化
  2. alien = {'color': 'green', 'points': 5}
  3. # 访问
  4. print(alien['color'])

增删改查

  1. # 增
  2. alien['x_pos'] = 0
  3. alien['y_pos'] = 20
  4. # 改
  5. alien['x_pos'] = 40
  6. # 删
  7. del alien['color']
  1. # 查键值(第一个元素是键,第二个元素是值;key和value只是变量名)
  2. for key, value in alien.items(): # items()访问各个键值对
  3. print("\nKey:" + key + "\tValue:" + str(value))
  4. # 查键、值
  5. for key in alien.keys():
  6. print(key)
  7. for value in alien.values():
  8. print(str(value))
  9. # keys() - 返回包含字典中所有键的列表
  10. print(alien.keys())
  11. # values() - 返回包含字典中所有值的列表
  12. print(alien.values())
  13. # 查值 【查键同理】
  14. for value in alien.values(): # 默认第一个是值 - for value in alien:
  15. print(str(value))
  1. # set过滤重复
  2. for value in set(alien):
  3. # sorted() - 按序遍历(默认顺序随缘)
  4. for key in sorted(alien.keys()):
  5. print(key.title())

各类操作小结

列表、元组、集合、字典的操作

  1. # 打印函数 用于测试
  2. def print_list():
  3. print('list1: ' + str(list1))
  4. print('set1: ' + str(set1))
  5. print('tup1: ' + str(tup1))
  6. print('dict1: ' + str(dict1))

创建

  1. # 字面量语法
  2. list1 = [1,2,3,4]
  3. set1 = {1,2,3,4}
  4. tup1 = (1,2,3,4)
  5. dict1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

添加元素

  1. def add_item(n):
  2. list1.append(n)
  3. set1.add(n)
  4. # tup1 元组不可增加元素
  5. dict1['e'] = 5

删除元素

  1. # 清空元素
  2. def clear_item():
  3. list1.clear()
  4. set1.clear()
  5. # tup1 元组不能清空元素
  6. dict1.clear()
  1. # 弹出元素
  2. def pop_item():
  3. list1.pop() # 列表弹出最后一个加入的
  4. set1.pop() # 集合弹出第一个加入的
  5. # tup1 元组不能弹出元素
  6. # dict1 字典不能弹出元素
  1. # 删除元素
  2. def del_item():
  3. del list1[0] # 按值删
  4. list1.remove(4) # 按索引删
  5. set1.discard(1) # 按值删
  6. # tup1 元组不能删除元素
  7. del dict1['a']

查找元素

  1. # 查找
  2. def find1_item(index):
  3. print(list1[index])
  4. # set1 集合无序不重复,无法通过索引查找
  5. print(tup1[index])
  6. print(dict1['a']) # 键查值
  7. print(dict1.keys()) # 查键列表
  8. print(dict1.values()) # 查值列表
  1. # 遍历
  2. def for_item():
  3. for l, s, t, d in list1, set1, tup1, dict1:
  4. print(l)
  5. print(s)
  6. print(t)
  7. print(d)
  1. # 查询
  2. def find2_item(n):
  3. if n in list1:
  4. print('yes')
  5. if n in set1:
  6. print('yes')
  7. if n in tup1:
  8. print('yes')
  9. if n in dict1:
  10. print('yes')

嵌套

字典列表

  1. # 字典列表 <=> 对象集合
  2. aliens = []
  3. for alien_number in range(4):
  4. alien = {'color': 'green',
  5. 'number': alien_number,
  6. 'points': 5,
  7. 'speed': 'slow'
  8. }
  9. aliens.append(alien)
  10. for alien in aliens:
  11. print(alien)

列表字典

  1. # 列表字典 <=> 更丰富的字典/对象
  2. cat = {
  3. 'color': 'black',
  4. 'name': ['小黑', 'tom']
  5. }
  6. print(cat)

字典的字典

  1. # 字典的字典 <=> 更丰富的字典/对象
  2. user = {
  3. 'liMing': {
  4. 'email': '123@qq.com',
  5. 'state': 'common',
  6. },
  7. 'wangHu': {
  8. 'email': '66993@qq.com',
  9. 'state': 'member',
  10. },
  11. }
  12. print(user)

类方法:

  • 公有
  • 私有 类名以两个下划线开头(子类无法访问父类的私有属性)

创建类

  1. # 创建类
  2. class cat():
  3. '''模拟猫'''
  4. # self形参必须定义在第一位,系统传实参,调用时仅传后两个参数即可
  5. def __init__(self, name): # 初始化函数名是固定的
  6. '''初始化属性name和age'''
  7. self.name = name # self用句号表示法访问变量/属性
  8. self.age = 4
  9. def sit(self):
  10. '''模拟猫坐下'''
  11. print(self.name.title() + " is now sitting")
  12. def roll_over(self):
  13. '''模拟猫打滚'''
  14. print(self.name.title() + " is now rolling")
  15. def read_age(self):
  16. print(self.name.title() + " is " + str(self.age) + " year age.")
  1. # 创建实例
  2. my_cat = cat('花花', 3)
  3. print("My cat's name is " + my_cat.name.title() + '.')
  4. print("My cat is " + str(my_cat.age) + " years age.")
  1. # 修改属性
  2. my_cat.age = 80 # 直接访问
  3. my_cat.read_age()
  4. # 创建方法
  5. def update_age(self, age):
  6. self.age = age
  7. my_cat.update_age(40)

继承

要求:父类包含在当前文件中,且位于子类前

  1. # 类继承
  2. class Restaurant():
  3. '''餐厅类'''
  4. def __init__(self, restaurant_name, restaurant_type):
  5. '''初始化属性name和type'''
  6. self.restaurant_name = restaurant_name
  7. self.restaurant_type = restaurant_type
  8. self.number = 0
  9. def open_restaurant(self):
  10. '''打印开店'''
  11. print(self.restaurant_name + " is opening")
  12. class Chinese_restaurant(Restaurant): # 注意此处要传入父类
  13. '''中式餐厅'''
  14. def __init__(self, restaurant_name, restaurant_type):
  15. '''初始化父类的属性'''
  16. super().__init__(restaurant_name, restaurant_type) # super()辅助继承
  17. self.level = 3 # 增加子类属性
  18. def open_restaurant(self):
  19. '''重写开店'''
  20. print(self.restaurant_name + " will open in 8:00.")
  21. my_chinese_restaurant = Chinese_restaurant('好运来', '川菜')
  22. my_chinese_restaurant.open_restaurant()
  1. # 类嵌套
  2. '''定义一个类class1,在另一个类中定义一个属性,其右值是之前定义的类:class1()'''
  3. # 从模块中导入类
  4. from module import Restaurant
  1. # 类库 - 有序字典
  2. from collections import OrderdDict
  3. people = OrderdDict()
  4. people['name'] = 'liMing'
  5. people['age'] = 26

闭包

闭包:定义一个函数中的函数,同时这个函数引用外层函数的变量

装饰器:为已存在的对象添加额外的功能,有助于让代码更简短

场景:需要为多个函数x()增加一个功能时,可以把此功能定义出来func(),并在参数中增加一个函数,此时的需求可以实现,但是调用时:func(x),此种调用方式破坏了原有的函数结构。故而使用装饰器为原有函数增加功能。

  • 装饰器
  1. # 简单的装饰器
  2. def use_logging(func):
  3. def wrapper():
  4. logging.warn("%s is running" % func.__name__)
  5. return func() # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
  6. return wrapper
  7. def foo():
  8. print('i am foo')
  9. foo = use_logging(foo) # 因为装饰器 use_logging(foo) 返回的时函数对象 wrapper,这条语句相当于 foo = wrapper
  10. foo() # 执行foo()就相当于执行 wrapper()
  1. # 语法糖
  2. def use_logging(func):
  3. def wrapper():
  4. logging.warn("%s is running" % func.__name__)
  5. return func()
  6. return wrapper
  7. @use_logging # 代替 foo = use_logging(foo) 语句
  8. def foo():
  9. print("i am foo")
  10. foo()
  1. # 指定参数
  2. def wrapper(name):
  3. logging.warn("%s is running" % func.__name__)
  4. return func(name)
  5. return wrapper
  1. # 类装饰器顺序
  2. @a
  3. @b
  4. @c
  5. def f ():
  6. pass
  • 访问器和修改器

python用一个下划线说明属性不建议修改(实际可以修改通过访问器和修改器操作):

  1. class Person(object):
  2. # __slots__ 限定Person对象只能绑定_name, _age和_gender属性
  3. __slots__ = ('_name', '_age', '_gender')
  4. def __init__(self, name, age):
  5. self._name = name
  6. self._age = age
  7. # 访问器 - getter方法
  8. @property
  9. def name(self):
  10. return self._name
  11. # 访问器 - getter方法
  12. @property
  13. def age(self):
  14. return self._age
  15. # 修改器 - setter方法
  16. @age.setter
  17. def age(self, age):
  18. self._age = age
  19. def play(self):
  20. if self._age <= 16:
  21. print('%s正在玩飞行棋.' % self._name)
  22. else:
  23. print('%s正在玩斗地主.' % self._name)
  24. def main():
  25. person = Person('王大锤', 12)
  26. person.play()
  27. person.age = 22
  28. person.play()
  29. # person.name = '白元芳' # AttributeError: can't set attribute
  30. person._gender = '男'
  31. # AttributeError: 'Person' object has no attribute '_is_gay'
  32. # person._is_gay = True
  33. if __name__ == '__main__':
  34. main()

静态方法和类方法

  1. # 静态方法:调用类方法使无需创建对象
  2. from math import sqrt
  3. class Triangle(object):
  4. def __init__(self, a, b, c):
  5. self._a = a
  6. self._b = b
  7. self._c = c
  8. # 声明类的静态方法
  9. @staticmethod
  10. def is_valid(a, b, c):
  11. return a + b > c and b + c > a and a + c > b
  12. def perimeter(self):
  13. return self._a + self._b + self._c
  14. def area(self):
  15. half = self.perimeter() / 2
  16. return sqrt(half * (half - self._a) *
  17. (half - self._b) * (half - self._c))
  18. def main():
  19. a, b, c = 3, 4, 5
  20. # 静态方法直接调用(静态方法和类方法都是通过给类发消息来调用的)
  21. if Triangle.is_valid(a, b, c):
  22. t = Triangle(a, b, c)
  23. print(t.perimeter())
  24. # 给类传入对象:通过给类发消息来调用对象方法但是要传入接收消息的对象作为参数
  25. # print(Triangle.perimeter(t))
  26. print(t.area())
  27. # print(Triangle.area(t))
  28. else:
  29. print('无法构成三角形.')
  30. if __name__ == '__main__':
  31. main()
  1. # 创建类方法对象
  2. from time import time, localtime, sleep
  3. class Clock(object):
  4. """数字时钟"""
  5. def __init__(self, hour=0, minute=0, second=0):
  6. self._hour = hour
  7. self._minute = minute
  8. self._second = second
  9. # cls是约定名
  10. @classmethod
  11. def now(cls):
  12. ctime = localtime(time())
  13. return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)
  14. def run(self):
  15. """走字"""
  16. self._second += 1
  17. if self._second == 60:
  18. self._second = 0
  19. self._minute += 1
  20. if self._minute == 60:
  21. self._minute = 0
  22. self._hour += 1
  23. if self._hour == 24:
  24. self._hour = 0
  25. def show(self):
  26. """显示时间"""
  27. return '%02d:%02d:%02d' % \
  28. (self._hour, self._minute, self._second)
  29. def main():
  30. # 通过类方法创建对象并获取系统时间
  31. clock = Clock.now()
  32. while True:
  33. print(clock.show())
  34. sleep(1)
  35. clock.run()
  36. if __name__ == '__main__':
  37. main()

继承的三种关系

  • is - a:继承或泛化
  • has - a:关联。整体和部分的关系
  • use - a:依赖。一个类方法的参数用到了另一个类

多态

多态:同样的方法,由于传入不同的对象,因而产生不同的状态

  1. from abc import ABCMeta, abstractmethod
  2. class Pet(object, metaclass=ABCMeta):
  3. """宠物"""
  4. def __init__(self, nickname):
  5. self._nickname = nickname
  6. @abstractmethod
  7. def make_voice(self):
  8. """发出声音"""
  9. pass
  10. class Dog(Pet):
  11. """狗"""
  12. def make_voice(self):
  13. print('%s: 汪汪汪...' % self._nickname)
  14. class Cat(Pet):
  15. """猫"""
  16. def make_voice(self):
  17. print('%s: 喵...喵...' % self._nickname)
  18. def main():
  19. pets = [Dog('旺财'), Cat('凯蒂'), Dog('大黄')]
  20. for pet in pets:
  21. pet.make_voice()
  22. if __name__ == '__main__':
  23. main()

测试代码

测试函数

  1. # func.py
  2. def get_formatted_words(first, last):
  3. '''generate a neatly formatted full name.'''
  4. full_words = first + ' ' + last
  5. return full_words
  1. # test.py
  2. import unittest
  3. from func import get_formatted_words
  4. # 继承自类 unittest.TestCase()
  5. class WordsTestCase(unittest.TestCase):
  6. '''测试get_formatted_name'''
  7. # 定义一个测试函数【再定义测试函数时,需要不同的函数名】
  8. def test_words(self):
  9. '''能正确处理 look up 这样的短语吗'''
  10. formatted_words = get_formatted_words('look', 'up')
  11. self.assertEqual(formatted_words, 'look up') # 判相等
  12. unittest.main()

测试类

方法 用途
assertEqual(a, b) 核实a == b
assertNotEqual(a, b) 核实a != b
assertTrue(x) 核实x == True
assertFalse(x) 核实x == False
assertIn(item, list) 核实item in list
assertNotIn(item, list) 核实item not in list

测试一组类对象

  1. # func.py
  2. class AnonymousSurvey():
  3. '''收集匿名调查问卷的答案'''
  4. def __init__(self, question):
  5. '''存储一个问题,并为存储答案做准备'''
  6. self.question = question
  7. self.answers = []
  8. def show_question(self):
  9. '''显示问卷问题'''
  10. print(question)
  11. def store_response(self, new_response):
  12. '''存储单份问卷答案'''
  13. self.answers.append(new_response)
  14. def show_results(self):
  15. '''显示收集到的所有答案'''
  16. print('suvery result:')
  17. for answer in answers:
  18. print('- ' + answer)
  1. # test.py
  2. import unittest
  3. from test import AnonymousSurvey
  4. class SuveryTestCase(unittest.TestCase):
  5. '''测试get_formatted_name'''
  6. def test_store(self):
  7. '''能正确处理存储答案吗'''
  8. question = "What language did you first learn to speak?"
  9. my_survey = AnonymousSurvey(question)
  10. responses = ['Chinses', 'Japanses', 'English']
  11. for response in responses:
  12. my_survey.store_response(response)
  13. for response in responses:
  14. self.assertIn(response, my_survey.answers)
  15. unittest.main()

setUp() - 创建对象一次

  1. # test.py 所有数据都要通过self调用
  2. import unittest
  3. from test import AnonymousSurvey
  4. class SuveryTestCase(unittest.TestCase):
  5. '''测试get_formatted_name'''
  6. def setUp(self):
  7. '''能正确处理存储答案吗'''
  8. question = "What language did you first learn to speak?"
  9. self.my_survey = AnonymousSurvey(question)
  10. self.responses = ['Chinses', 'Japanses', 'English']
  11. def test_store(self):
  12. for response in self.responses:
  13. self.my_survey.store_response(response)
  14. for response in self.responses:
  15. self.assertIn(response, self.my_survey.answers)
  16. unittest.main()

终端输出与结果的对应关系:

显示 测试结果
. 通过
E 错误
F 断言失败

文件

操作模式

打开与关闭

  1. fp = open(filename)
  2. fp.write(content, 'a')
  3. fp.close()
操作模式 具体含义
'r' 读取 (默认)
'w' 写入(会先截断之前的内容)
'x' 写入,如果文件已经存在会产生异常
'a' 追加,将内容写入到已有文件的末尾
'b' 二进制模式
't' 文本模式(默认)
'+' 更新(既可以读又可以写)

读 - read

  1. # 读文本文件【同目录下文件】
  2. # open(路径+文件名) 返回一个文件对象,存储在变量file_object中
  3. file_path = 'file_name'
  4. # 默认是读,可也指定 open(file_path, 'r', encoding='utf-8')
  5. with open(file_path) as file_object: # with 让程序在合适的时机关闭文件
  6. contents = file_object.read() # read 在文件末尾是返回一个空字符串,即相比与原文件多出一个空行
  7. print(contents)
  8. # 删除空行的方法 contents.rstrip()
  9. # 读二进制文件
  10. with open(file_path, 'rb') as f_obj:
  11. date = f_obj.read()
  12. print(type(date))
  13. # 相对路径 基于程序所在的文件夹
  14. file_path = 'txt\file_name'
  15. # 绝对路径
  16. file_path = 'C:\Users\MrFeng\Documents\python\txt\pi.txt'
  1. # 读压缩包的数据
  2. def load_data(filename):
  3. '''装载数据'''
  4. with open(filename, 'rb') as f1:
  5. content = np.frombuffer(f1.read(), np.uint8, offset=16)
  6. return content

问题:\U \M 会被理解为未编码的转义字符,报错

解决方法:

  • \替换为/【Linux系统和OS X系统写法】
  • r显式声明不使用转义字符func(r"xxx")
  • 使用\的转义字符\\
  1. # 每次一行读取 for
  2. with open(file_path) as file_object:
  3. for line in file_object:
  4. print(line.rstrip() + '.')
  5. # 另一种方式 readlines
  6. with open(file_path) as file_object:
  7. lines = file_object.readlines()
  8. for line in lines:
  9. print(lint.rstrip() + '.')

写 - write

  1. # 向文件写入内容
  2. file_path = r'pi.txt' # 不加转义
  3. with open(file_path, 'w') as file_object:
  4. file_object.write("I love Programming\n")
  5. # 追加文件
  6. open(file_path, 'a')

注意事项:

  • 若不存在此文件,会创建
  • 若原来文件中有内容,会被覆盖

write 和 writelines 区别

  • write(字符串)
  • writelines(序列)

文件类型

JSON文件

javascript object notation 一种存储格式,字典格式(可用编译器打开)

序列化:将数据结构或对象转化成可存储的形式

json模块主要有四个比较重要的函数,分别是:

  • dump - 将Python对象按照JSON格式序列化到文件
  • dumps - 将Python对象处理成JSON格式的字符串
  • load - 将文件中的JSON数据反序列化成对象
  • loads - 将字符串的内容反序列化成Python对象
  1. import json
  2. numbers = [200, 3, 4, 6, 7, 8]
  3. filename = 'numbers.json'
  4. # dump(data, file) data写入file
  5. with open(filename, 'w') as f_obj:
  6. json.dump(numbers, f_obj)
  7. # load(file) file 写入内存
  8. with open(filename) as f_obj:
  9. nums = json.load(f_obj)
  10. print(nums)
  11. # 把名字写入json文件,下次运行时打开此json文件,读取名字
  12. import json
  13. filename = 'username.json'
  14. def input_info():
  15. msg = "输入你的名字,sir:"
  16. username = input(msg)
  17. with open(filename, 'w', encoding='utf-8') as f_obj:
  18. json.dump(username, f_obj)
  19. def open_file():
  20. with open(filename) as f_obj:
  21. username = json.load(f_obj)
  22. return username
  23. def judge_user(username):
  24. msg = username + " is your name(y/n):"
  25. judge = input(msg)
  26. if judge == 'y':
  27. print("欢迎回来," + username + ".")
  28. else:
  29. input_info()
  30. def greet_user():
  31. try:
  32. username = open_file()
  33. except FileNotFoundError:
  34. input_info()
  35. else:
  36. judge_user(username)
  37. greet_user()

text文件

记事本打开

  1. def save_file():
  2. '''把数据保存为json文件和格式化的text文件'''
  3. txt_filename = '酷狗Top500歌单信息.txt'
  4. for data in datas:
  5. msg = f"第{data['rank']}名,歌名《{data['song']}》,由{data['singer']}演唱,时长:{data['time']}\n"
  6. with open(txt_filename, 'a', encoding='utf-8') as f:
  7. f.write(msg)
  8. print('写入成功')

csv文件

EXCEL打开,之间用逗号分隔

python入门,一篇就够了的更多相关文章

  1. Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了

    转载:Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了 - 简书 (jianshu.com) 一. Gitlab-CI/CD使用场景 首先,公司使用Gitlab作为工作仓库进行代 ...

  2. 《IM开发新手入门一篇就够:从零开发移动端IM》

        登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页   即时通讯网›专项技术区›IM开发新手入门一篇就够:从零开发移动端IM   帖子 打赏 分享 发表评论162     想开 ...

  3. SEO入门一篇就够-SEO教程

    大家口中的SEO(Search Engine Optimization),中文翻译为"搜索引擎优化",从本质上来说,其实就是如何迎合搜索引擎的规则,使得网站在搜索结果中能有更好的排 ...

  4. 【原创】新手入门一篇就够:从零开发移动端IM

    一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和沟通代价,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...

  5. Shiro入门这篇就够了【Shiro的基础知识、回顾URL拦截】

    前言 本文主要讲解的知识点有以下: 权限管理的基础知识 模型 粗粒度和细粒度的概念 回顾URL拦截的实现 Shiro的介绍与简单入门 一.Shiro基础知识 在学习Shiro这个框架之前,首先我们要先 ...

  6. Python入门 io篇

    简单demo with open('d:/pydemo/pythonStart/fun1.py', 'r') as f: #print(f.read()) while True: line = f.r ...

  7. python入门第一篇

    python里面 单行注释用:#被注释内容 多行注释用:"""被注释内容""" 要想py2.7和py3.5都能运行,必须在文件头部加: #/ ...

  8. AJAX入门第一篇就够了

    什么是Ajax Ajax(Asynchronous JavaScript and XML) 异步JavaScript和XML Ajax实际上是下面这几种技术的融合: (1)XHTML和CSS的基于标准 ...

  9. python入门第二篇

    整体注释:ctrl+? 1.运算符 +  -  *  /   //(取商) **(幂) %(求余) 判断某个东西是否在某个东西里面包含:  in           not in 不等于: <& ...

  10. Zookeeper入门一篇就够了

    谈点分布式 什么是分布式呢? 起初,我们的应用流量比较小,所有东西全部部署在一个服务器,比如全部丢给一个tomcat来处理,顶多做一个tomcat的多节点部署多分,再挂一台Nginx做一下负载均衡就O ...

随机推荐

  1. C#处理医学影像(四):基于Stitcher算法拼接人体全景脊柱骨骼影像

    在拍摄脊柱或胸片时,经常会遇到因设备高度不够需要分段拍摄的情况, 对于影像科诊断查阅影像时希望将分段影像合并成一张影像,有助于更直观的观察病灶, 以下图为例的两个分段影像:       我们使用Ope ...

  2. 【ATL】注册插件成功后自动设置浏览器允许弹出窗口注册表

    STDAPI DllInstall(BOOL bInstall, LPCWSTR pszCmdLine) { HRESULT hr = E_FAIL; static const wchar_t szU ...

  3. Hibernate 基本操作、懒加载以及缓存

    前言 上一篇咱们介绍了 Hibernate 以及写了一个 Hibernate 的工具类,快速入门体验了一波 Hibernate 的使用,我们只需通过 Session 对象就能实现数据库的操作了. 现在 ...

  4. 2023-04-04:使用 Golang 和 ffmpeg-go 库实现 demuxing_decoding.c,轻松掌握音视频分离解码技巧。

    2023-04-04:使用 Golang 和 ffmpeg-go 库实现 demuxing_decoding.c,轻松掌握音视频分离解码技巧. 答案2023-04-05: 使用github/moonf ...

  5. 2023-02-13:力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号 它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集群 其中连接 connections 是

    2023-02-13:力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号 它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集群 其中连接 connections 是 ...

  6. AccessToken、for_user、get_token

    在Django REST framework的SimpleJWT库中,AccessToken是一个类,用于表示一个JSON Web Token (JWT)中的访问令牌部分.访问令牌是一种常见的身份验证 ...

  7. 我写了本开源书:《3D编程模式》

    大家好,我写了本开源书,罗列了我从自己的实战项目中提炼出来的关于3D编程(主要包括"3D引擎/游戏引擎"."编辑器"开发)的各种编程模式 本书的在线阅读地址在这 ...

  8. shrio QuickStart

    Shrio三大对象:  springboot整合shrio 登录拦截认证 创建项目时勾选web,导入依赖: <dependency> <groupId>org.apache.s ...

  9. 图解MySQL在Linux下的安装与配置

    MySQL简介 MySQL是最流行的RDBMS(Relational Database Management System:关系数据库管理系统)之一,被广泛地应用在互联网上的中小型网站中.关联数据库将 ...

  10. 一个.Net强大的Excel控件,支持WinForm、WPF、Android【强烈推荐】

    推荐一个强大的电子表单控件,使用简单且功能强大. 项目简介 这是一个开源的表格控制组件,支持Winform.WPF和Android平台,可以方便的加载.修改和导出Excel文件,支持数据格式.大纲.公 ...