注:工作之余,学习一门脚本语言,选择了当下火热的Python。2020-05-27日开始学习Python基础语法,期间参考《Python编程从入门到实践——Eric Matthes著》一书,对书中涉及的部分语法、python关键字、内置函数、库等进行试验,在此做一简单记录,以备往后温故知新。在函数/函数参数中,[]表示可选;<>表示必选;xxx.fun()表示对象方法;fun()表示内置函数。
目录
【1】2020-05-27:Hellow Python
【2】2020-05-27:My First Logic Test
【3】2020-05-28:简单数据类型
【4】2020-05-28:列表简介与列表元素增、删、改、排序测试
【5】2020-05-29:列表遍历、for循环、range()内置函数、列表解析、切片、深浅拷贝、元组
【6】2020-05-29:对于【2】遍历IP地址的代码重构
【7】2020-05-30:对于if条件语句以及相关关键字的使用
【8】2020-05-30:字典定义与遍历、增删改查、字典与列表嵌套
【9】2020-05-30:while、continue、break的使用,input()的使用以及字典的巩固
【10】2020-05-30:python函数、模块、参数列表、以及相关内置函数的使用
【11】2020-05-31:基于前面所学,编写的基础版本图书管理系统
【12】2020-05-31:Python中类的使用
【13】2020-05-30:文件读写、try...except异常处理,JSON文件操作
【14】2020-06-01:测试代码,主要是Python的测试类简单使用了解
【15】Python的常用方法、函数、库、类等总结(时常更新):
1、常见字符串类型判断方法:
2、需求驱动学习之子串判断:
3、需求驱动学习之迭代器:
4、Pygame游戏库
5、Matplotlib数学绘图库、Pygal绘图库
github: hello_python.p
涉及:print()内置函数的使用。
github: ip_addr_loop.py
涉及:import time、while循环、time.sleep()、str()内置函数的使用。
github: test_03_str_int_float.p
涉及:字符串的定义('',“”,'\'三符号在字符串表达中的使用方式);string.title()、string.upper()、string.lower()的使用;字符串的拼接“+”的使用;删除多余空白方法lstrip()、rstrip()、strip()的使用;+、-、*、/、**(乘方)、%运算符的使用;浮点数、整数、字符串的混合使用与运算等,以及python之禅。
github: test_04_list_operator_1.py
涉及:列表的格式与定义;list.append([data])、list.reverse()、list.insert([index], )、list.pop([index])、list.remove([data])、list.sort([reverse=True])方法的使用;len()、sorted(
, [reverse=True])内置函数的使用;del、while、if、or等关键字的使用。
github: test_04_list_operator_2.py
涉及:二维列表的格式与定义、访问;全局变量和局部变量的使用以及注意点描述;def、global、if、is、“for ... in ... :”、关键字使用;list()、range(start, end [,step])、min()、max()、sum()、id()、hex()等内置函数的使用;列表切片list[start:end]、list[start:]、list[:end]、list[:]以及列表解析:list = [(value ** 2) for value in range(1,20,2)]、for value in list[-10:]的灵活应用;列表的引用(浅拷贝)和副本(深拷贝)测试;元组和局部变量赋值的差异以及id()查看差异的方法测试。
github: test_04_list_ip_addr_loop.py
涉及:for value in range():在【2】例程代码重构中的使用。
github:test_05_if_elif_else.py
涉及:if、if ... elif ... else语句的简单测试,关于in、not in在if语句中的使用,以及in配合for循环的使用;is 、 and 、 not ... is ...测试以及is和==的区别(is表示判断对象id是否相等,==表示判断对象值是否相等),对应的 not ... is ... 和 != 也有类似区别;Ture和Flase的测试以及其对象类型为BOOL,不像C中BOOL其实就是整型数据。
github:test_06_dictionary.py 【2020年6月1日00:02:55使用json进行优化】
涉及:字典的语法,key-value格式,key是唯一的,而value是不唯一的,不同key可能有同一个value,key一般取整数、字符串等,而value可以是任何对象类型(数字、字符串、列表、字典等);字典的遍历:dict.items()、key的遍历:dict.keys()、value的遍历dict.values()、由于value涉及重复,因此会用set()内置函数剔除重复元素,而字典是无序的,可以通过sorted()内置函数对dict.keys()进行排序等操作,基本操作如下(详细测试见github):
#***********************************************************************
#字典索引: dict[key]
#字典遍历:
# 遍历key-vlaue键值对--> for k,v in dict.items():
# 遍历key--> for k in dict.keys():
# 遍历value--> for v in set(dict.values()):
#我们可以用
# if xxx not in dict.keys():
# if xxx in dict.keys():
# 来确定某个key是否在字典的现有key里
# 因为dict.keys()、dict.values()实际上都是获取一个列表
#set()内置函数用来提供一个集合,集合中所有元素都是唯一的,即剔除重复值
#***********************************************************************
github:test_07_while_input.py
涉及:while、continue、break的相关关键字(基本没啥看的,只是和其他语言的格式不一样罢了),input()获取用户输入的函数测试,input([User input information])函数用于获取用户输入,返回值为用户输入string,括号内可以输出提示信息,提示信息后为用户输入空间,回车结束,直接回车则返回""。此外涉及int()、float()、long()等内置函数。这一节主要是一些结构:列表、字典、循环、遍历等的综合应用,巩固了之前所学。
github:test_08_function.py
涉及:python函数与def、return等 关键字,模块导出与import、as等关键字;默认形参、可变参数列表、制度参数列表(通过完全副本实现,导致效率低下,所以一般由函数自行保证内部只读); isinstance(
#-----------------------------------------------------------------------
#可变个数参数列表
#通过"*para_list"来实现,通过元组将可变参数列表封装并传递
#判断参数类型的内置函数:
# isinstance(, )
# type(, )
# 如:isinstance(10,int)判断10是否是int的整数,返回True
# isinstance和type的区别在:
# 1、type是用来获取类型的,isinstance是用来判断类型的;
# 2、type() 不会认为子类是一种父类类型,不考虑继承关系,
# 而isinstance() 会认为子类是一种父类类型,考虑继承关系
#-----------------------------------------------------------------------
#-----------------------------------------------------------------------
#模块导入、函数导入:
# 有一个文件:module_name.py
# "import module_name" 即可导入该文件(模块)
# "module_name.function()"来使用其中的函数
# 要是指向导入部分函数,则可以使用:
# "from import module_name fun1, fun2, fun3, ..."
# 按如上方式导入个别函数,则可以直接使用函数名,不需要"module_name."
# 若导入个别函数与本文件函数名冲突,
# 可在导入的时候用as关键字为该导入的函数指定别名,
# 如果不想用"module_name."调用函数,但是所有函数都要导出,
# 不可能一个个导出,则使用:"import module_name *"来导出所有函数
# 同样可以给模块指定别名,以更合适的名字来操作模块中的函数
# 指定别名后,原名字不能直接使用,除非重新导入原名字
# 规范:import尽量放在文件开头(不包括开头注释等)
#-----------------------------------------------------------------------
github:test_08_book_management.py
涉及:①函数/方法:前面所学print()、input()、int()、float()、str()、abs()、sleep()、isinstance()、str.strip()、str.upper()、dict.keys()、dict.items()、dict.values()、value.isdigit()等系统内置函数/方法、库函数、以及自定义函数;②关键字:if、elif、else、for、in、while、return、def、continue、break、not、or、and、False、True、as、import、del、from、is、try、except等关键字;③数据类型:整数、浮点数、字符串、列表、字典、以及多种数据结构的嵌套使用;④知识点:主要是列表、字典的结构组织方式、操作方法以及函数的定义与使用。
github:test_09_class.py、test_09_class_equip.py、test_09_class_role.py
涉及:Python2.7和Python3.8中关于父类、子类的定义与使用,包括__init__()初始化函数、self的使用,子类继承父类,子类重写父类方法、基于模块化的类,类的import和标准类库collections.OrderedDict的使用等。
#-----------------------------------------------------------------------
#类的继承:
# 1、B继承A则必须保证A在B之前声明
# 2、父类A也称为超类(supercalss),因此在子类的__init__()中,
# 应该调用super().__init__()先完成对父类的初始化,再初始化子类自己
# 3、类名用驼峰命名法,函数用下划线命名法
#
# 4、python3.8父类和子类创建语法:
# class Father():
# def __init__(self, pa, pb, pc)
# ......
# class Son(Father):
# def __init__(self, pa, pb, pc, pd, pe)
# super().__init__(pa, pb, pc)
# ......
#
# 5、python2.7父类和子类创建语法:
# (创建子类会给父类传递self,帮助python把父子类关联起来):
# class Father(object):
# def __init__(self, pa, pb, pc)
# ......
# class Son(Father):
# def __init__(self, pa, pb, pc, pd, pe)
# super(Son, self).__init__(pa, pb, pc)
# ......
#-----------------------------------------------------------------------
github:文件打开读写操作、异常处理、JSON数据dump和load操作
涉及:①文件的打开、关闭、读写等操作:open()、close()、read()、write()、readline()、readlines();文件路径注意点(对于Windows中的路径符号'\'可能会被识别为转义符号,因此可能需要自行对'\'进行转义);关于"with open() as obj"操作的使用,replace()函数的使用、read()和readlines()的区别,前者返回字符串,后者返回列表,对于字符串可用split()函数,对于列表就用不了了。②异常的处理,包括try、except、else、pass的使用,split()函数的使用,以及常见异常:FileNotFoundError、ZeroDivisionError、TypeError、NameError、ValueError等;③基于JSON类库的dump和load操作,可以用来保存数据到文件中,或者从文件中解析数据。保存是带格式的,解析要格式对应。
优化以往代码(在退出时使用json类保存书店的字典信息,在启动时从保存的json文件中再按字典将历史数据读取出来,注意保存和读取时指定编码方式,此外读取时先读取到字符串中,再解析字符串):
#-----------------------------------------------------------------------
#功能函数:退出书店,系统总入口
#-----------------------------------------------------------------------
def book_quit_sys(customer_name, file_name):
global g_book_set
book_set = g_book_set
try:
with open(file_name, 'w', encoding='utf-8') as file_object:
print("-------------------------------------")
print(customer_name + "正在退出图书管理系统,请稍等!")
json.dump(book_set, file_object)
print("-------------------------------------")
print("json dump dictionary to " + file_name + " succeed!")
except FileNotFoundError:
print(file_name + "file or dirctory is not exist")
#-----------------------------------------------------------------------
#功能函数:进入书店,初始化系统总入口
#-----------------------------------------------------------------------
def book_system_init(customer_name='', file_name=''):
global g_book_set
try:
with open(file_name, 'r', encoding='utf-8') as file_object:
print("-------------------------------------")
print(customer_name + "正在初始化图书管理系统,请稍等!")
print("-------------------------------------")
json_str = file_object.read()
if len(json_str) > 0:
g_book_set = json.loads(json_str)
print("json load dictionary to " + file_name + " succeed!")
else:
print("没有库存数据!!")
except FileNotFoundError:
print(file_name + "file or dirctory is not exist")
github:基于图书管理系统的python测试类简单使用
涉及:Python的unittest类的使用。
#-----------------------------------------------------------------------
#图书管理系统的简单测试用例
#核实结果为 a == b :assertEqual(a,b)
#核实结果为 a != b :assertNotEqual(a,b)
#核实结果为 True :assertTrue(a)
#核实结果为 False :assertFalse(a)
#核实item在list中 :assertIn(item,list)
#核实item不再list中 :assertNotIn(item,list)
#每一个函数都可以创建多个用例,避免程序修改后需要手动一个个去测试
#但是这种测试方法是白盒测试,针对函数/类,可以直接访问程序的数据
#-----------------------------------------------------------------------
Python基础语法已经学习完毕(2020年6月1日22:52:48)
s.isalnum() #所有字符都是数字或者字母,为真返回 Ture,否则返回 False。
s.isalpha() #所有字符都是字母,为真返回 Ture,否则返回 False。
s.isdigit() #所有字符都是数字,为真返回 Ture,否则返回 False。
s.islower() #所有字符都是小写,为真返回 Ture,否则返回 False。
s.isupper() #所有字符都是大写,为真返回 Ture,否则返回 False。
s.istitle() #所有单词都是首字母大写,为真返回 Ture,否则返回 False。
s.isspace() #所有字符都是空白字符,为真返回 Ture,否则返回 False。
#需求驱动学习:
#1、查找字符串里是否存在指定子串,如果指定begin和end范围,则检查是否包含在指定范围内,
#如果包含子字符串返回开始的索引值,否则返回-1。这个会在删除指定串开始到指定串之间的文本时会用到
#(比如最近项目需求删除源文件中函数头部统一格式的注释信息,只保留对外头文件的一份注释,
#由于适配层文件较多,这种情况就可以写个脚本批量操作,节省许多不必要的时间),虽然正则可能会更方便,
#但是暂时不熟悉正则~.~,改天做个学习专题。
import string
string.find(str, beg=0, end=len(str))
#2、迭代器模块( 为高效循环而创建迭代器的函数)
#全排列和全组合函数
from itertools import permutations
from itertools import combinations
应用参见:基于扑克的24算式
关于itertools的更详细描述与使用参见:itertools --- 为高效循环而创建迭代器的函数
#-----------------------------------------------------------------------
#前期工作:确保python安装、pygame安装
#升级pip(不升级也可以,只要确保安装了pip即可)
# python -m pip install --upgrade pip
#查看version
# python -m pip --version
#执行下载安装pygame模块操作
# python -m pip install pygame
#关于pygame的使用可参考:
# https://www.pygame.org/
#-----------------------------------------------------------------------
相关资料:GITHUB 、 Pygame DOCS
《Python编程从入门到实践》游戏练习:alien_invasion
#-----------------------------------------------------------------------
#前期工作:确保python安装、matplotlib、pygal安装
#升级pip(不升级也可以,只要确保安装了pip即可)
# python -m pip install --upgrade pip
#查看version
# python -m pip --version
#执行下载安装matplotlib、pygal模块操作
# python -m pip install matplotlib
# python -m pip install pygal
#
#关于matplotlib的、pygal使用可参考:
# https://matplotlib.org
# https://matplotlib.org/contents.html
# https://http://www.pygal.org
#-----------------------------------------------------------------------
相关资料:matplotlib官网学习资料、pygal官网学习资料(例程)
《Python编程从入门到实践》相关练习:data_view