• [技术干货] Python基础第三方模块requests openpyxl【转】
    一、第三方模块的下载与使用1、什么是第三方模块第三方模块是指别人编写的模块第三方模块一般功能都比较强大2、如何安装第三方模块方式一:pip工具安装方式:1、打开python解释器的安装目录,找到Scipts目录,该目录下会有pip.exe的程序,这个程序就是用来安装第三方模块的2、将python版本对应的Scipts文件目录添加至系统环境变量3、打开cmd命令提示符窗口,在cmd命令窗口中运行下载第三方模块的句式下载第三方模块的句式pip install 模块名下载第三方模块临时切换仓库pip install 模块名 -i 仓库地址下载第三方模块指定版本(不指定默认是最新版)pip install 模块名==版本号 -i 仓库地址注意事项:我们的电脑中可能安装了多个版本的python解释器,每个版本中都有pip工具,在我们使用pip安装模块时,需要下载在我们使用的版本中的pip工具中,否则下载的模块将无法运行方式二:pycharm中下载安装方式:1、在pycharm中点击左上角File2、在下方目录中找到Settings3、找到Project,打开python Interpreter4、点击'+'号,在上方窗口内输入想要下载的模块5、点击Install Package,等待即可下载完成注意事项:1、在安装窗口右侧找到Specify versin 可选择需要下载模块版本号2、Manage Repositories可配置仓库地址3、注意事项1、报错并有警告信息WARNING: You are using pip version 20.2.1;原因在于pip版本过低 只需要拷贝后面的命令执行更 新操作即可d:\python38\python.exe -m pip install --upgrade pip更新完成后再次执行下载第三方模块的命令即可2、报错,提示关键字Timeout提示该关键字说明当前计算机网络不稳定,只需更换网络或等待网络稳定后下载即可3、报错,无关键字面向百度搜索只需拷贝报错信息到百度搜索即可通常都是需要用户提前准备好一些下载环境才可以顺利下载4、下载速度慢pip的默认下载地址都是国外的,我们只需要切换下载地址即可关于切换下载地址的方式在上面已经说明常用下载地址清华大学 :https://pypi.tuna.tsinghua.edu.cn/simple/阿里云:http://mirrors.aliyun.com/pypi/simple/中国科学技术大学 :http://pypi.mirrors.ustc.edu.cn/simple/华中科技大学:http://pypi.hustunique.com/豆瓣源:http://pypi.douban.com/simple/腾讯源:http://mirrors.cloud.tencent.com/pypi/simple华为镜像源:https://repo.huaweicloud.com/repository/pypi/simple/二、网络爬虫之requests模块1、简介requests模块是一个第三方模块,需要在额外进行安装它是一个用于网络请求的模块,主要用来向浏览器发送请求2、使用方法导入模块:import requests1.关键词:get( )作用:用于向浏览器发送请求代码用法:url = "https://www.baidu.com"res = requests.get(url)2.关键词:encoding作用:指定编码格式,针对一些古老的网站,在获取网页信息的时候,不指定编码格式的话可能会出现乱码。不指定的情况下默认使用系统自带的编码环境代码用法:res = encoding = 'utf8'3.关键词:content作用:返回的是一个原生字符串,是bytes类型代码用法:print(res.content)# 返回的是一个原生字符串,是bytes类型三、openpyxl模块1、简介openpyxl模块属于第三方模块,是一个在 python 中能够处理 excel 文件的模块,还有比较出名的是xlrd、xlwt 分别控制excel文件的读写,这俩个能够兼容所有版本的文件。openpyxl 针对 excel 2003版本之前的兼容性可能不好 但是功能更加强大。注意事项:excel文件的版本及后缀2003版本之前 excel的文件后缀是xls2003版本之后 excel的文件后缀是xlsx、csv2、创建文件相关2、1.创建excel文件关键词:workbook作用:使用 openpyxl 创建文件。只需导入Workbook类代码用法:.导入模块:form openpyxl import workbook代码用法:from openpyxl import Workbookwb = Workbook# 一个 excel 文件创建成功2、2.创建工作簿关键词:cerate_sheet( )作用:使用 openpyxl 创可以创建自定义名称的工作簿。括号里的参数是工作簿名称,还有一个参数是工作簿的位置,也可以不写建文件。只需导入Workbook类可以创建多个工作簿,并且可按照顺序排列代码用法:导入模块:form openpyxl import workbook代码用法:from openpyxl import Workbookwb = Workbook()ws1 = wb.cerate_sheet('工作簿名称', 0)sheet 是自动生成的2、3.修改工作簿名称关键词:title作用:可以更改工作簿名称通过待修改名称工作簿‘点’的方式在后方赋予新的名称代码用法:导入模块:form openpyxl import workbook代码用法:from openpyxl import Workbookwb = Workbook()ws1 = wb.cerate_sheet('用户信息表', 0)ws1.title = 'user_infor'2、4.修改工作簿颜色关键词:sheet_properties.tabColor作用:用来给工作簿背景修改颜色,需要用到RGB色域代码用法:导入模块:from openpyxl import Workbookwb = Workbook()ws1 = wb.create_sheet('用户信息表', 0)ws1.sheet_properties.tabColor = 'FF6666'# 将标题背景改为指定RRGGBB颜色代码2、5.查看文件所有工作簿关键词:sheetname作用:查看exexl文件下所有的工作簿,返回的是一个列表代码用法:导入模块:from openpyxl import Workbook代码用法:wb = Workbook()ws1 = wb.create_sheet('uese_zhangzhang')ws2 = wb.create_sheet('user_kangkang')print(wb.sheetname)# ['user_zhangzhang', 'user_zhangzhang']3、写入内容相关3、1.写入/修改内容关键词:ws[]作用:可以通过工作簿'点'的方式,在后方中括号内填写内容的位置,来修改内容代码用法:导入模块:from openpyxl import Workbook代码用法:wb = Workbook()ws1 = wb.create_sheet('uese_zhangzhang')ws1['A1'] = 'kangkang'# ws1['A1'] 代表的是该表中的 A1 位置,我们可以将数据直接赋值给它关键词:cell( )作用:可以通过工作簿'点'的方式,在后方参数内填写内容的位置,来修改内容row:行colum:列value:值(对应位置的数据)代码用法:导入模块:from openpyxl import Workbook代码用法:wb = Workbook()ws1 = wb.create_sheet('uese_zhangzhang')ws1.cell(row = 1, column= 1, value = 'kangkang')# 在第一行,第一列,填入数值'kangkang'4、读取内容相关4、1.访问多个单元格用法:直接使用切片操作的方式代码用法:x = ws['A1':'C2']x1 = ws['C']x2 = ws['C:D']x3 = ws[10]x4 = ws[5:10]4、2.获取单元格值关键词:values作用:使用for循环的方式,可以一次获取整行文本数据值代码用法:导入模块:from openpyxl import Workbook代码用法:wb = Wordbook()ws1 = wb.create_sheet('nser_name', 0)ws1.append(['name', 'age', 'hobby'])ws1.append(['kangkang', 18, 'read'])for i in ws1.vallue:print(i)
  • [技术干货] Python基础globlal nonlocal和闭包函数装饰器语法糖【转】
    一、global与nonlocal1、global在py文件中,一般无法调用函数体内变量名,而global可使函数体代码内的变量名直接在函数体外部调用,条件是在需要调用的代码体中使用global 调用需要的变量名未使用global情况:# 在外部绑定一个变量名 name = 'kangkng' # 定义一个函数体代码 def func():     # 函数体内部重新绑定一个变量名     name = 'zhangzhang' # 调用函数func func() # 这时无法打印函数体内部的变量名 print(name) ------------------------------------------------------------------------ kangkang    使用global情况:# 在函数体内部使用global时,可在外部直接调用函数内部变量名 name = 'kangkng' # 定义一个函数体代码 def func():     # 使用global调用变量名     global name     # 函数体内部重新绑定一个变量名     name = 'zhangzhang' # 调用函数func func() # 外py中打印name print(name) ------------------------------------------------------------------------ zhangzhang 2、nonlocal在函数嵌套使用时,通常在父代码体中无法调用子代码中变量名,而nonlocal的作用是,可以在父代码中直接调用子代码中的变量名,条件是需要在子代码中使用nonlocal 调用需要的变量名未使用nonlocal情况:# 定义一个函数体代码 def outer():     # 绑定一个变量名     name = 'kangkang'     # 代码体内部再次定义一段函数体     def subcoat():         # 内层中绑定变量名         name = 'zhangzhang'     # 在函数外层打印变量名     print(name) # 调用外层函数体代码 outer() -----------------------------------------------------------------------  kangkang 使用nonlocal情况:# 在函数体内部使用global时,可在外部直接调用函数内部变量名 def outer():     # 函数外层绑定一个变量名     name = 'kangkang'     # 代码体内部再次定义一段函数体     def subcoat():         # 在函数体内层使用nonlocal,调用变量名         nonlocal name         # 内层中绑定变量名         name = 'zhangzhang'     # 调用内层函数     subcoat()     # 在函数外层打印变量名     print(name) # 调用外层函数体代码 outer()    ---------------------------------------------------------------------- zhangzhang 二、函数名的多种用法引言:​ 函数名就相当于变量名,只不过函数名绑定的是一段函数体代码,在我们使用这个函数名加括号时就可以调用这段代码体,具体由以下几种用法:1、当做变量名赋值def func():     print('我是func函数体代码') res = func print(res()) ------------------------------------------------------------------------ 我是func函数体代码 None 2、当作函数的参数def func():     print('我是func函数体代码') def func1(a):     print('我是func1函数体代码', a)     a() func1(func) ------------------------------------------------------------------------ 我是func1函数体代码 &lt;function func at 0x000001D0C14D6310&gt; 我是func函数体代码 3、当作函数的返回值def func():     print('我是func函数体代码') def func1():     print('我是func1函数体代码')     return func res = func1() print(res) res() ------------------------------------------------------------------------ 我是func1函数体代码 &lt;function func at 0x00000218F95B6310&gt; 我是func函数体代码 4、当作容器类型的数据def spring():     print('我是春季,生机盎然') def summer():     print('我是夏季,活力四射') def autumn():     print('我是秋季,翩翩起舞') def winter():     print('我是冬季,大雪纷飞') while True:     season_dict = { '1': spring,                '2': summer,                '3': autumn,                '4': winter                    }     season_select = input('根据编号,选择您喜欢的季节&gt;&gt;&gt;:').strip()     if season_select in season_dict:         season_dict.get(season_select)()     else:         print('你选择的编号不存在') ------------------------------------------------------------------------ 三、闭包函数1、什么是闭包函数  一个函数的返回值是另外一个函数,返回的函数调用父函数内部的变量,如果返回的函数在外部被执行,就产生了闭包2、闭包函数需满足的条件满足以下两个条件的就是闭包函数:条件一:定义在函数内部的函数条件二:用到了外部函数空间名称中的名子3、闭包函数的作用作用:使函数外部能够调用函数内部放入属性和方法缺点:闭包操作导致整个函数的内部环境被长久保存,占用大量内存4、闭包函数的实际应用1.函数内部变量名在外部被访问def fun1():     name = 'python'     def inner():         print(name)     return inner result = fun1() result() ------------------------------------------------------------------------ python 2.函数体内部函数体代码可以通过外部访问def fun2():     def inner():         print("执行了内部函数inner")     def all():         return inner     return all result = fun2() result()() ------------------------------------------------------------------------ 执行了内部函数inner 四、装饰器​ 当我们需要将一段函数体代码在不改变调用方式和源代码的情况下,需要给这个段代码添加新的功能时,这时候我们就需要给这段代码安装一个装饰器,装饰器是指将这段代码封装在闭包函数内,来达到既能满足上述条件,又能增加新的功能的条件概念在不修改被装饰对象源代码和调用方式的情况下给被装饰的对象添加新的功能本质并不是一门新的技术,而是由函数参数、名称空间、函数名多种用法、闭包函数组合到一起的效果口诀对修改封闭,对扩展开放1、装饰器推导流程1、首先定义一段函数体代码,当我们给这段函数传入指定的参数时,他就会暂停一秒,然后运行,使它在运行结束后,能够统计它的运行时间import time def index(a, b):     time.sleep(1)     print(index,a, b) 2、通常,我们只需要在这段代码运行前打印一个时间戳,运行后再次打印一个时间戳,在这段代码运行结束后通过前后时间的插值就能统计出这段代码的运行时间,但这种办法使用起来比较麻烦且只能使用一次方法一:     import time     def index(a, b):         start = time.time()         time.sleep(1)         print(index, a, b)         end = time.time()         print(end - start)     index(1,2) 方式二:     import time     def index(a, b):         time.sleep(1)         print(index, a, b)     start = time.time()     index(1,2)     end = time.time()     print(end - start) 3、通过上述方法的方式二,我们可以得出将函数名包裹在统计时间功能代码内,这样在调用时相对便捷,进一步思考,若将这段代码使用函数封包,那样在调用时就可以更为便捷,在以后统计该代码时,只需要调用封包这段代码的函数名就可以直接统计这段代码的运行时间import time def index(a, b):     time.sleep(1)     print(index, a, b) def time_():     start = time.time()     index()     end = time.time()     print(end - start) time_() ------------------------------------------------------------------------ Traceback (most recent call last):   File "D:/pytcharm项目文件路径/38/11.py", line 297, in <module>     time_()   File "D:/pytcharm项目文件路径/38/11.py", line 293, in time_     index() TypeError: index() missing 2 required positional arguments: 'a' and 'b' 4、虽然这种方式可以行得通,但只能针对没有参数的函数体代码,若这段代码需要传参者无法运行,并直接报错。再次进一步思考,只需要将封包的这段函数设置为有参函数就可解决这个问题import time def index(a, b):     time.sleep(1)     print(index, a, b) def core(a,b):     start = time.time()     index(a, b)     end = time.time()     print(end - start) core(1, 2) ------------------------------------------------------------------------ <function index at 0x000001F4A0026310> 1 2 5、由上推导可看出,虽然此功能可以更为便捷的统计代码执行时间,但若是源代码的参数需要修改则封包它的参数也需要修改,这时我们可联想到将参数修改为可变长参数,就不会出现这个问题import time def index(a, b):     time.sleep(1)     print(index, a, b) def core(*args,**kwargs):     start = time.time()     index(*args, **kwargs)     end = time.time()     print(end - start) core(1,2) ------------------------------------------------------------------------ <function index at 0x000002ECDD4E6310> 1 2 1.004744529724121 6、这样无论源代码参数如何修改,我们都可以进行传参,虽然这个问题解决了,但考虑使用的广泛性,若有其他函数体也需要用到这个功能时,还需要重新修改封包内代码,这时,我们可以使用闭包的方式来满足这个条件import time def index(a, b):     time.sleep(1)     print(index, a, b) def func(x, y, z):     time.sleep(2)     print(func, x, y, z) def outer(index):     def core(*args, **kwargs):         start = time.time()         index(*args, **kwargs)         end = time.time()         print(end - start)     return core res = outer(func) res(1, 2, 3) ------------------------------------------------------------------------ <function func at 0x0000018C23686670> 1 2 3 2.00856614112854 7、通过将源代码函数名放至闭包函数参数内,就可以达到可以调动任何函数体代码都可以执行此功能的方法,但并未满足闭包函数的条件,源代码的调用方式改变了,这时我们可以通过将原函数体代码赋值的方式来达到调用方式和源代码都未改变的情况下来增加此功能import time def index(a, b):     time.sleep(1)     print(index, a, b) def func(x, y, z):     time.sleep(2)     print(func, x, y, z) def outer(index):     def core(*args, **kwargs):         start = time.time()         index(*args, **kwargs)         end = time.time()         print(end - start)     return core index = outer(index) index(1,2) func = outer(func) func(1, 2, 3) ------------------------------------------------------------------------ <function outer.<locals>.core at 0x0000026C17F58280> 1 2 1.004807710647583 <function outer.<locals>.core at 0x0000026C17F58940> 1 2 3 2.0077626705169678 2、装饰器语法糖什么是装饰器语法糖当我们使用装饰器调用被装饰的函数体代码时,总是需要在调用前通过赋值的方式来调用,这样的方式相对比较麻烦,这时我们就可以用到装饰器语法糖来节省时间和代码语法糖的使用方法和条件用法:在源代码函数体上方使用@加装饰器函数名条件:源代码需在装饰器下方具体用法import time def outer(index):     def core(*args, **kwargs):         start = time.time()         res = index(*args, **kwargs)         end = time.time()         print(end - start)         return res     return core @outer def index(a, b):     time.sleep(1)     print(index, a, b)     return 'index' index(1,2) 3、装饰器模板def outer(func):     def inner(*args, **kwargs):         # 执行被装饰对象之前可以做的额外操作         res = func(*args, **kwargs)         # 执行被装饰对象之后可以做的额外操作         return res     return inner
  • [技术干货] Python基础之文件操作及光标移动详解【转】
    一、文件操作1、文件的概念1.文件就是计算机暴露给用户操作硬盘的快捷方式2.计算机的文件,就是用来储存某种信息的数据3.在计算机中,文件是以二进制的方式储存信息的2、代码打开文件的方式方式一:f = open(文件路径, 读写模式, encoding='utf8')f.close()方式二: # 子代码运行结束后会自动调用close方法关闭资源with open(文件路径, 读写模式,encoding='utf8') as f:须知:# 1、open方法的第一个参数是文件路径,并且撬棍跟一些字母的组合会产生特殊的含义导致路径查找混乱 为了解决该问题可以在字符串的路径前面加字母rD:\a\n\tr'D:\a\n\t'# 2、with一次性可打开多个文件with open() as f1,open() as f2,open() as f3:二、文件读写模式1、'r' 只读模式 read只能读,不能写1.文件路径不存在:直接报错with open(r'b.txt','r',encoding='utf8') as f:print(f.read())2.文件路径存在:正常读取内容with open(r'a.txt', 'r', encoding='utf8') as f:print(f.read())2、'w' 只写模式 write只能写,不能看1.文件路径不存在: # 创建新的文件with open(r'b.txt','r',encoding='utf8') as f:pass2.文件路径存在: # 先清空文件内容,在重新写入with open(r'a.txt', 'r', encoding='utf8') as f:f.write('编写内容')须知:# 1、编写的内容需要自己加入换行符,在保存后u而要注意他的存在3、'a' 尾部追写模式 add只能在文件末尾添加数据1.文件路径不存在: # 创建新的文件with open(r'b.txt','a',encoding='utf8') as f:pass2.文件路径存在: # 在文件末尾添加with open(r'a.txt', 'a', encoding='utf8') as f:f.write('编写内容')当我们在编写代码的时候 有些部分不知道写什么具体代码 但是也不能空着不写这个时候可以使用关键字: pass作用:是为了保证程序结构的完整性,否则会报错三、文件操作模式1、t 文本模式文本模式为默认模式1、读写模式简写:r、w、a全称:rt、wt、at须知:# 1、只能操作文本文件# 2、读写以字符为单位# 3、需要指定encoding参数,不填写则采用计算机默认的编码2、b 二进制模式byte模式1、不是默认的模式,需要指定生成rb、wb、ab须知:# 1、可以操作任意文件# 2、读写都是以bytes为单位# 3、不需要指定encoding参数,不需要编码不管是哪种模式,针对文件路径是否存在的情况都是一样的四、文件诸多方法1、read()代码表现:文件名.read()须知:# 1、一次性读取文件内容,并且光标停留在文件末尾,继续读取则没有内容# 2、当文件内容比较多的时候,该方法还可能会造成计算机内存溢出# 3、括号内可以填写数字,在文本模式下,表示读取几个字符# 4、通常一个中文三个字节(或更多)一个英文字母一个字节2、for循环代码表现:for 数据值 in 需要遍历的文件:须知:# 1、一行行读取文件内容 避免内存溢出现象的产生3、line1、readline代码表现:文件名.readline()须知:# 1、一次只读一行内容2、readlines代码表现:文件名.readline()须知:# 1、一次性读取文件内容,会按照行数组织成列表的一个个数据值4、readable代码表现:代码表现:文件名.readable()须知:# 1、判断文件是否具备读取数据能力5、write1、write用于向文件中写入指定数据代码表示:f = open("a.txt", 'w')f.write("写入一行新数据")f.close()2、writeable用来判断文件是否可写入数据代码表示:f = open("nhooo.txt", "a")print(f.writable())可以写入: Ture不可写入: False3、writelines用于接收一个列表,一次性将列表中所有数据写入代码表示:f = open('a.txt', 'r')n = open('b.txt','w+')n.writelines(f.readlines())n.close()f.close()6、flush用于刷新内部缓冲区,这是在python中处理fila处理时的最佳实践,可以在将新文本写入/添加到文件之前清除内部缓冲区。将内存中文件数据立刻刷到硬盘 等价于ctrl + s代码表示file_object.flush()五、文件内光标的移动1、seek()移动文件的读取指针到指定位置。seek函数需要使用文件对象进行调用,无返回值。seek()有三种用法:seek(offset,whence)offset 控制光标移动的位移量(字节)whence 模式0 基于文件开头移动多少字节1 基于光标当前所在位置移动多少字节2 基于文件末尾移动多少字节ps:1和2只能在二进制模式下使用 0无所谓2、tell()用来获取光标当前的位置(移动的字节数)代码表示:文件名.tell()# 返回光标当前所在的字节数
  • [技术干货] matplotlib画图之修改坐标轴刻度问题【转】
    一、未设置横纵坐标轴刻度(默认情况下)示例代码1# 修改x轴与y轴的刻度 import matplotlib.pyplot as plt lst1 = list(range(0,15)) lst2 = list(range(15,30)) plt.plot(lst1,lst2) plt.show()此时上图中的坐标轴刻度间距为2二、修改坐标轴刻度通过添加以下代码对坐标轴刻度进行修改from pylab import xticks,yticks,np # 修改横坐标的刻度 xticks(np.linspace(0,15,16,endpoint=True)) # 修改纵坐标的刻度 yticks(np.linspace(15,30,16,endpoint=True))linspace()中四个参数的意义(本人理解,可能有误!):第一个参数为坐标的起始位置第二个参数为坐标的终止位置第三个参数为将坐标分成多少份(该例中将0-15分成了16份,每刻度为1)第四个参数为是否取最后一个点(默认是endpoint=False左开右闭)示例代码2# 修改x轴与y轴的刻度 import matplotlib.pyplot as plt from pylab import xticks,yticks,np lst1 = list(range(0,15)) lst2 = list(range(15,30)) """ linspace()中四个参数的意义: 第一个参数为坐标的起始位置 第二个参数为坐标的终止位置 第三个参数为将坐标分成多少份(该例中将0-15分成了16份,每刻度为1) 第四个参数为是否取最后一个点(默认是endpoint=False左开右闭) """ # 修改横坐标的刻度 xticks(np.linspace(0,15,16,endpoint=True)) # 修改纵坐标的刻度 yticks(np.linspace(15,30,16,endpoint=True)) plt.plot(lst1,lst2) plt.show()此时上图中的坐标轴刻度间距为1三、给对应的横坐标刻度加上标签文本默认情况下刻度显示的文本就是刻度本身如果要修改刻度的话,需要在plt.xticks()方法中在再添加一个参数,在示例代码2中添加如下代码xticks_labels = ['11点{}分'.format(i) for i in range(0,16)] # 修改横坐标的刻度,并且为横坐标上的每个刻度添加标签 xticks(np.linspace(0,15,16,endpoint=True),xticks_labels)示例代码3# 修改x轴与y轴的刻度 import matplotlib.pyplot as plt from pylab import xticks,yticks,np lst1 = list(range(0,15)) lst2 = list(range(15,30)) """ linspace()中四个参数的意义: 第一个参数为坐标的起始位置 第二个参数为坐标的终止位置 第三个参数为将坐标分成多少份(该例中将0-15分成了16份,每刻度为1) 第四个参数为是否取最后一个点(默认是endpoint=False左开右闭) """ xticks_labels = ['11点{}分'.format(i) for i in range(0,16)] # 修改横坐标的刻度 xticks(np.linspace(0,15,16,endpoint=True),xticks_labels) # 修改纵坐标的刻度 yticks(np.linspace(15,30,16,endpoint=True)) plt.plot(lst1,lst2) plt.show()在示例代码3中添加以下代码解决中文显示问题:from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体(解决中文无法显示的问题) mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像时负号“-”显示方块的问题
  • [技术干货] Python中pywifi模块的基本用法讲解【转】
    跨平台的pywifi模块支持操作无线网卡,该模块易于使用,同时支持Windows、Linux等多个系统,这篇文章主要介绍了Python中pywifi模块的基本用法,需要的朋友可以参考下  跨平台的pywifi模块支持操作无线网卡,该模块易于使用,同时支持Windows、Linux等多个系统。pywifi模块不是Python的标准模块,需单独安装,同时该模块依赖comtypes模块,最好同时安装comtypes模块,否则调用pywifi的函数时可能会报错。12pip install comtypespip install pywifi  pywifi模块中的类不算太多,其中主要用到的类包括PyWiFi、Profile、Interface等,详述如下:  PyWiFi类用于操作无线设备,该类的主要函数interfaces返回可用的无线网卡集合,也即Interface对象集合。  Profile类表示无线接入点(AP),也即无线网卡搜索出的无线连接,一个Profile对象表示一个可以连接或可用的无线连接,Profile类的主要属性如下表所示:序号属性名说明1ssid无线网络名称2auth认证算法,包括AUTH_ALG_OPEN、.AUTH_ALG_SHARED两种,默认为AUTH_ALG_OPEN,关于认证算法的介绍详见参考文献53akm授权密钥管理方式,包括AKM_TYPE_NONE、AKM_TYPE_WPA、AKM_TYPE_WPAPSK、AKM_TYPE_WPA2、AKM_TYPE_WPA2PSK、AKM_TYPE_UNKNOWN,默认为AKM_TYPE_NONE,关于授权密钥管理方式详见参考文献6-74cipher密码类型,包括CIPHER_TYPE_NONE、CIPHER_TYPE_WEP、CIPHER_TYPE_TKIP、CIPHER_TYPE_CCMP、CIPHER_TYPE_UNKNOWN,默认为CIPHER_TYPE_NONE5key无线网络连接密码,如果密码类型不未CIPHER_TYPE_NONE,则应设置本属性值  ;Interface类用于执行无线网络操作,主要包括以下函数:序号函数名说明1name获取无线网卡名称2scan调用无线网卡扫描可用的无线网络(AP)3scan_results获取scan函数的扫描结果,返回的是Profile对象列表4add_network_profile添加特定无线网络(AP)以便后续连接5remove_network_profile移除指定的无线网络(AP)6remove_all_network_profiles移除所有无线网络(AP)7network_profiles获取保存的所有无线网络(AP)8connect连接指定的无线网络(AP)9disconnect断掉当前无线网络连接10status获取当前无线网络连接状态  最后是照着参考文献3编写的测试程序(测试前请确保已记住当前计算机连接的wifi密码) import pywifi  wifi = pywifi.PyWiFi() iface = wifi.interfaces()[0]  print('interface name: ',iface.name()) print('interface status: ',iface.status())  iface.disconnect() print('interface status: ',iface.status())  profile = pywifi.Profile() profile.ssid = "XXXXXXX" profile.auth = pywifi.const.AUTH_ALG_OPEN  profile.akm.append(pywifi.const.AKM_TYPE_WPA2PSK) profile.cipher = pywifi.const.CIPHER_TYPE_CCMP profile.key = 'XXXXXXX' iface.remove_all_network_profiles() tep_profile = iface.add_network_profile(profile) iface.connect(tep_profile)  sleep(5) print('interface status: ',iface.status()) 
  • [技术干货] 详解Python中四种关系图数据可视化的效果对比【转】
    python关系图的可视化主要就是用来分析一堆数据中,每一条数据的节点之间的连接关系从而更好的分析出人物或其他场景中存在的关联关系。这里使用的是networkx的python非标准库来测试效果展示,通过模拟出一组DataFrame数据实现四种关系图可视化。其余还包含了pandas的数据分析模块以及matplotlib的画图模块。若是没有安装这三个相关的非标准库使用pip的方式安装一下即可。 pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple/  pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/  pip install networkx -i https://pypi.tuna.tsinghua.edu.cn/simple/ 分别将使用到的python模块导入到我们的代码块中,就可以开始开发了。 # Importing the matplotlib.pyplot module as plt. import matplotlib.pyplot as plt  # Importing the pandas module and giving it the alias pd. import pandas as pd 这里为了避免中文乱码的情况,分别对字体和编码进行了统一化的设置处理。 plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False  # Importing the networkx module and giving it the alias nx. import networkx as nx 这里我们采用了有向图的模式来进行演示,有向图也是在生产过程中最常用的一种可视化模式。G = nx.DiGraph() # 创建有向图 初始化一个DataFrame数据对象作为关系图生成的数据来源。data_frame = pd.DataFrame(     {         'A': ['1', '2', '3', '4', '5', '6'],         'B': ['a', 'b', 'c', 'd', 'e', 'f'],         'C': [1, 2, 3, 4, 5, 6]     } ) 1、随机分布模型使用随机分布模型的生成规则时,生成的数据节点会采用随机的方式进行展示,生成的数据节点之间相对比较分散更容易观察数据节点之间的关系指向。 for i, row in data_frame.iterrows():     G.add_edge(row['A'], row['B'], weight=row['C'])  pos = nx.random_layout(G)  nx.draw(G, pos, with_labels=True, alpha=0.7)  labels = nx.get_edge_attributes(G, 'weight')  nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)  plt.axis('equal')  plt.show() 2、放射数据模型放射状数据模型,顾名思义就是以一个数据节点为中心向周边以发散状的模式进行分布,使用数据节点指向多个节点的可视化展示。缺点是如果数据不够规范的情况下会展示成一团乱麻的情况,需要经过特殊的可视化处理。使用方法这里直接将上述随机分布模型的pos模型直接替换成下面的放射状数据模型即可。pos = nx.spring_layout(G, seed=4000, k=2) 3、其他模型其余两种方式使用同样的方式将随机分布模型中pos模型进行替换即可实现,这里分别展示以下实现效果。特征值向量模型pos = nx.spectral_layout(G) 图形边缘化分布模型图形边缘化分布模型
  • [技术干货] python QT界面关闭线程池的线程跟随退出完美解决方案【转】
    方法一、线程池执行的循环代码为自己写的情况定义一个全局变量,默认为T,当QT界面关闭后,将该变量值改为F。线程执行的循环代码内增加一个判断方法,每次循环之前对全局变量进行判断,如果结果为T则进行循环、如果为F,则break退出循环,结束线程 from concurrent.futures import ThreadPoolExecutor  import time a = True  # 设置全局变量 def fun():  # 线程池执行的函数     while a:  #  线程池中的循环代码,每次循环都检查一遍变量a的值         time.sleep(0.1)  # 线程需要执行的具体代码         print('1')  tp = ThreadPoolExecutor(5)  # 创建线程池 for i in range(10):     tp.submit(fun)  # 向线程池提交任务  time.sleep(1)   a = False  # 需要结束线程池任务时,执行该代码 tp.shutdown()  # 关闭线程池 方法二、线程池中执行的循环为调用的模块内的方法比如 paramiko 库中,sftp下载文件的方法。这种情况可以利用回调函数进行判断。回调函数检查控制变量,如果检测到需要停止执行时,执行sys.exit()结束退出线程 from concurrent.futures import ThreadPoolExecutor import sys import time  a = True def call(): # 定义退出的函数     if not a:         print('线程结束退出')         sys.exit()  # 退出  def fun(callback=None):  # 模拟sftp.get方法,循环执行,并且有回调函数     while True:         time.sleep(0.1)         print('1')         if callback != None:             callback()  # 每次循环调用回调函数,进行判断是否需要结束线程  tp = ThreadPoolExecutor(5) for i in range(10):     tp.submit(fun, call)  time.sleep(1) a = False tp.shutdown() 
  • [技术干货] Python常用标准库之os模块功能【转】
    模块导入方式: import osos模块是Python标准库中的一个用于访问操作系统相关功能的模块,os模块提供了一种可移植的使用操作系统功能的方法。使用os模块中提供的接口,可以实现跨平台访问。但是,并不是所有的os模块中的接口在全平台都通用,有些接口的实现是依赖特定平台的,比如linux相关的文件权限管理和进程管理。os模块的主要功能:系统相关、目录及文件操作、执行命令和管理进程Ps:其中的进程管理功能主要是Linux相关的,此处不做讨论。在使用os模块的时候,如果出现了问题,会抛出OSError异常,表明无效的路径名或文件名,或者路径名(文件名)无法访问,或者当前操作系统不支持该操作。>>> import os>>> os.chdir("d:\11")Traceback (most recent call last):File "", line 1, inos.chdir("d:\11")OSError: [WinError 123] 文件名、目录名或卷标语法不正确。: 'd:\t'系统相关os模块提供了一些操作系统相关的变量,可以在跨平台的时候提供支持,便于编写移植性高,可用性好的代码。所以在涉及操作系统相关的操作时,请尽量使用本模块提供的方法,而不要使用当前平台特定的用法或格式,否则一旦移植到其他平台,可能会造成难以解决的困扰。下面列举os模块中常用的方法和变量,及其用途解释。os.name #查看当前操作系统的名称。windows平台下返回‘nt',Linux则返回‘posix'。os.environ #获取系统环境变量os.sep #当前平台的路径分隔符。在windows下,为‘\',在POSIX系统中,为‘/'。os.altsep #可替代的路径分隔符,在Windows中为‘/'。os.extsep #文件名和文件扩展名之间分隔的符号,在Windows下为‘.'。os.pathsep #PATH环境变量中的分隔符,在POSIX系统中为‘:',在Windows中为‘;'。os.linesep #行结束符。在不同的系统中行尾的结束符是不同的,例如在Windows下为‘\r\n'。os.devnull #在不同的系统上null设备的路径,在Windows下为‘nul',在POSIX下为‘/dev/null'。os.defpath #当使用exec函数族的时候,如果没有指定PATH环境变量,则默认会查找os.defpath中的值作为子进程PATH的值。>>> import os>>> os.name'nt'>>> os.environenviron({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\Administrator\\AppData\\Roaming', 'ASL.LOG': 'Destination=file', ......>>> os.sep'\\'>>> os.altsep'/'>>> os.extsep'.'>>> os.pathsep';'>>> os.linesep'\r\n'>>> os.devnull'nul'>>> os.defpath'.;C:\\bin'文件和目录操作os模块中包含了一系列文件操作相关的函数,其中有一部分是Linux平台专用方法。Linux是用C写的,底层的libc库和系统调用的接口都是C API,Python的os模块中包括了对这些接口的Python实现,通过Python的os模块,可以调用Linux系统的一些底层功能,进行系统编程。关于Linux的相关方法,内容较为复杂,可根据需要自行查阅官方文档,这里只介绍一些常用的,各平台通用的方法。os.getcwd() #获取当前工作目录,即当前python脚本工作的目录路径os.chdir("dirname") #改变当前脚本工作目录;相当于shell下cdos.curdir #返回当前目录: ('.')os.pardir #获取当前目录的父目录字符串名:('..')os.makedirs('dir1/dir2') #可生成多层递归目录os.removedirs(‘dirname1') #递归删除空目录(要小心)os.mkdir('dirname') #生成单级目录os.rmdir('dirname') #删除单级空目录,若目录不为空则无法删除并报错os.listdir('dirname') #列出指定目录下的所有文件和子目录,包括隐藏文件os.remove('filename') #删除一个文件os.rename("oldname","new") #重命名文件/目录os.stat('path/filename') #获取文件/目录信息os.path.abspath(path) #返回path规范化的绝对路径os.path.split(path) #将path分割成目录和文件名二元组返回os.path.dirname(path) #返回path的目录。其实就是os.path.split(path)的第一个元素os.path.basename(path) #返回path最后的文件名。如果path以/或\结尾,那么就会返回空值。os.path.exists(path或者file) #如果path存在,返回True;如果path不存在,返回Falseos.path.isabs(path) #如果path是绝对路径,返回Trueos.path.isfile(path) #如果path是一个存在的文件,返回True。否则返回Falseos.path.isdir(path) #如果path是一个存在的目录,则返回True。否则返回Falseos.path.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略os.path.getatime(path) #返回path所指向的文件或者目录的最后存取时间os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间os.path.getsize(filename) #返回文件包含的字符数量在Python中,使用windows的文件路径时一定要小心,比如你要引用d盘下的1.txt文件,那么路径要以字符串的形式写成'd:\1.txt'或者r'd:\1.txt。前面的方式是使用windwos的双斜杠作为路径分隔符,后者是使用原生字符串的形式,以r开始的字符串都被认为是原始字符串,表示字符串里所有的特殊符号都以本色出演,不进行转义,此时可以使用普通windows下的路径表示方式。这两种方法使用哪种都可以,但不可混用。一些简单使用的例子:>>> os.getcwd()'C:\\Python36'>>> os.chdir("d:")>>> os.getcwd()'D:\\'>>> os.curdir'.'>>> os.pardir'..'>>> os.makedirs("1\\2")>>> os.removedirs("1\\2")>>> os.listdir()['$360Section', '$RECYCLE.BIN', '1.txt', 'MobileFile', 'pymysql_test.py', 'System Volume Information', '用户目录']>>> os.mkdir("1")>>> os.listdir()['$360Section', '$RECYCLE.BIN', '1', '1.txt', 'MobileFile', 'pymysql_test.py', 'System Volume Information', '用户目录']>>> os.rmdir("1")>>> os.rename('1.txt','2.txt')>>> os.listdir()['$360Section', '$RECYCLE.BIN', '2.txt', 'MobileFile', 'pymysql_test.py', 'System Volume Information', '用户目录']>>> os.remove('1.txt')Traceback (most recent call last):File "", line 1, inos.remove('1.txt')FileNotFoundError: [WinError 2] 系统找不到指定的文件。: '1.txt'>>> os.remove('2.txt')>>> os.stat()Traceback (most recent call last):File "", line 1, inos.stat()TypeError: Required argument 'path' (pos 1) not found>>> os.stat(os.getcwd())os.stat_result(st_mode=16895, st_ino=1407374883553285, st_dev=2431137650, st_nlink=1, st_uid=0, st_gid=0, st_size=32768, st_atime=1505824872, st_mtime=1505824872, st_ctime=1445187376)>>> import os>>> os.chdir("d:")>>> os.getcwd()'D:\\'>>> os.mkdir('test')>>> os.listdir()['$360Section', '$RECYCLE.BIN', 'MobileFile', 'pymysql_test.py', 'System Volume Information', 'test', '用户目录']>>> os.chdir('test')>>> os.getcwd()'D:\\test'>>> os.path.abspath(os.getcwd())'D:\\test'>>> os.path.split(os.getcwd())('D:\\', 'test')>>> cp = os.getcwd()>>> os.path.dirname(cp)'D:\\'>>> os.path.basename(cp)'test'>>> os.path.exists(cp)True>>> os.path.exists("d:\\123\123")False>>> os.path.isabs(cp)True>>> os.path.isabs("11\\1.py")False>>> os.path.isfile(cp)False>>> os.path.isfile("d:\\1.txt")False>>> os.path.isdir(cp)True>>> os.path.join(cp, "test.py")'D:\\test\\test.py'>>> os.path.getatime(cp)1505825113.4970243>>> os.path.getmtime(cp)1505825113.4970243>>> os.path.getsize(cp)0执行命令在早期的Python版本中,通常使用os模块的system或者popen等方法执行操作系统的命令。但是,最近Python官方逐渐弃用了这些命令,而是改用内置的subprocess模块执行操作系统相关命令。os.system(command)运行操作系统命令,直接显示结果。但返回值是0或-1,不能获得显示在屏幕上的数据。 command是要执行的命令字符串。我们尝试在linux下使用ipython交互式界面运行一下:In [1]: import osIn [2]: ret = os.system("ifconfig")lo: flags=73 mtu 1500inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0xfeloop (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0wifi0: flags=4163 mtu 1500inet 10.124.49.169 netmask 255.255.255.0 broadcast 10.124.49.255inet6 fe80::d88f:91a9:4239:5e44 prefixlen 64 scopeid 0xfdether 28:16:a8:59:32:4f (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0In [3]: retOut[3]: 0
  • [技术干货] python3中的函数与参数及空值问题【转】
    画星星程序2-7-7主要使用turtle.forward前进操作和turtle.left左转操作在屏幕上画星星。12345678910111213#!/usr/bin/env python3# -*- coding: utf-8 -*-#2-7-8.pyimport turtleturtle.color('Green','yellow')while True:turtle.forward(200)turtle.left(150)print(turtle.pos())if abs(turtle.pos()) < 1:breakprint('按回车键退出')input()空值NonePython None 对象,表示缺乏值、空值。下面代码定义了x和y共2个变量,其中,x初始化值为0,而y设为了空值,x虽然为0,但仍然属于有值状态,而y属于空值状态。123456>>>x=0>>>y=None>>>x==NoneFalse>>>y==NoneTrue函数与Lambda一、函数定义Python定义函数使用关键字 def,后跟函数名与括号内的形参列表。函数语句从下一行开始,并且必须缩进。程序2-7-10-1.py定义了函数getSum,完成参数求和后返回 。#!/usr/bin/env python312345# -*- coding: utf-8 -*-#2-7-10-1.pydef getSum(x1,x2,x3,x4):    y=x1+x2+x3+x4    return yprint(getSum(11,22,33,44))程序2-7-10-1.py执行结果如下:110程序2-7-10-1.py执行过程如下:1、定义函数getSum,使用def关键字+函数名getSum的方式进行定义,参数为括号内的4个变量x1、x2、x3、x4。函数的执行体为函数定义的下一行,共2行。(1)第1行y=x1+x2+x3+x4,将4个参数之和赋值给变量y。其中,y是函数内局部变量,而x1、x2、x3、x4为函数局部变量。(2)第2行return y,将y返回,return语句功能是是函数返回值,没有 return 语句的函数也返回值,只不过这个值是 None。2、调用getSum函数,并打印函数返回结果。二、引用变量查找函数在执行时使用函数局部变量符号表,所有函数变量赋值都存在局部符号表中;引用变量时,其查找顺序为:首先,在局部符号表里查找变量,然后,是外层函数局部符号表,接着是全局符号表,最后是内置名称符号表。因此,虽然可以引用全局变量和外层函数的变量,但是最好不要在函数内直接赋值(除非是 global 语句定义的全局变量,或 nonlocal 语句定义的外层函数变量)。程序2-7-10-2.py定义了函数getSum,完成参数求和后返回,与2-7-10-1.py基本相同,不同之处在于,在getSum函数体内出现了变量y,而在getSum函数体外也出现了变量y。
  • [技术干货] python画图时linestyle,color和loc参数的设置方式【转】
    ython画图时linestyle,color和loc参数的设置本人没有看过专门介绍matplotlib的书籍,所以一直以来对一些画图的风格不是很清楚,今天总结一下linestyle,color和loc,供那些像我一样没看过这方面介绍的人使用。linestyle和color是matplotlib做表时常用的两个参数,只要是需要线条的,不论是主图,还是添加的网格线,基本上是都会遇到的。loc则是用来确定位置的,一般添加图例的时候回用到。颜色字符(color)字符代表颜色r红色b蓝色g绿色w白色c青色m洋红y黄色k黑色风格字符(linestyle)字符代表风格- (一个连字符)实线– (两个连字符)虚线-.点划线:点虚线’ ’留空,空格loc 参数(以matplotlib添加图例为例说明位置)loc stringloc code位置"best"0右上角(默认)“upper right”1右上角“upper left”2左上角“lower left”3左下角“lower right”4右下角"right"5中右侧“center left”6中左侧“center right”7中右侧“low center”8中下方“upper center”9中上方“center”10中间python画图基础python用于画图常用matplotlib和seaborn**1.matplotlib使用前需要导入api1import matplotlib.pyplot as plt1.1绘制基本图像1.1.1折线图1.准备数据1234import randomx = range(60)y = [random.uniform(15,18) for i in x]#random.uniform 中参数即为取值范围。2.创建画布12plt.figure(figsize=(20,5),dpi=100)#其中参数figsize即为图像大小,dpi为分辨率。3.绘制图像1plt.plot(x,y)4.图像显示1plt.show()1.1.2 散点图重复1,2,4步第3步改为plt.scatter(x,y)图像显示:1.1.3柱状图重复1,2,4步第3步改为plt.bar(x,y)图像显示:1.1.4 直方图重复1,2,4步第三步改为plt.hist(y)只传入一个y参数,表示y的分布情况图像显示:
  • [技术干货] 解决Python httpx 运行过程中无限阻塞的问题【转】
    ython httpx 运行过程中无限阻塞requests 模块只支持 http1,在遇到 http2 的数据接口的时候(某乎的搜索接口),需要采用支持http2 请求的模块(如 httpx、hyper)。本文是针对 httpx 在请求数据时,出现无限阻塞问题的一些处理方法。httpx 的 timeout 有 bug,会导致脚本在运行一段时间后,出现线程阻塞卡死的问题(无限 timeout)。1.通过 pm2 部署脚本另外启动一个脚本,定时对该脚本进行重启操作。举个栗子: import time import os  while True:     time.sleep(60 * 60) # 一小时重启一次     os.system('pm2 restart test')   这个方法有个不好的地方,在请求过程中,可能需要翻很多页,如果不断重启脚本,可能导致无法翻到最后一页。2.通过装饰器给函数设置一个最大执行超时时间当函数执行时间超过某个时间就抛出 TimeOut 异常 from func_timeout import func_set_timeout import func_timeout import time  @func_set_timeout(5)  # 函数最大执行时间 5s def test():     time.sleep(20)  def run():     try:         test()         print('test 函数执行完成')     except func_timeout.exceptions.FunctionTimedOut:         print('test 函数执行超时') run() 如上面例子那样,在 httpx.Client 所在函数设置一个额外等待时间,当该函数执行时间超过某个时间,就强制抛出 timeout 异常,避免程序无限阻塞。python爬虫httpx的用法安装命令:pip install httpx请求方式GET123456import httpx​headers = {'user-agent': 'my-app/1.0.0'}params = {'key1': 'value1', 'key2': 'value2'}url = 'https://httpbin.org/get'r = httpx.get(url, headers=headers, params=params)POST1r = httpx.post('https://httpbin.org/post', data={'key': 'value'}) PUT1r = httpx.put('https://httpbin.org/put', data={'key': 'value'})DELETE1r = httpx.delete('https://httpbin.org/delete') 
  • [分享交流] 【其他】多维分析预汇总应该怎样做才管用?
    【其他】多维分析预汇总应该怎样做才管用?
  • [互动交流] 活动案例无法正常运行
     关于活动【有奖体验】ModelArts Ascend与PyCharm联合开发,已经实现pycharm 的设置,但是案例无法正常运行,报错信息如下。​
  • [互动交流] 修改dataframe一个值,语法错误
    我想修改一个DataFrame的一个值,用eval,就下面一句,但一值报语法错,不知道错在哪里。请大牛指点一下。@{readExcel_ret}.iloc[2,2]='Jack'@{readExcel_ret}是一个dataframe的变量。
  • [技术干货] 人生重开模拟器(Python实现)-转载
     人生重开模拟器介绍 人生重开模拟器是由VickScarlet上传至GitHub的一款简单的文字网页游戏。   玩家点击“立即重开”并设置角色的初始属性后,程序就会随机为玩家生成对应的人生经历。   代码实现 下面我们实现一个简化版的人生重开模拟器,主要目的在于熟悉Python的语法。  打印初始界面 初始界面可以自由发挥,这里博主就随便打印一下。  代码如下:  # 打印初始界面 print('+-------------------------------------------+') print('|                                           |') print('|              >>人生重开模拟器<<              |') print('|                                           |') print('|            这垃圾人生一秒也不想待了            |') print('|                                           |') print('+-------------------------------------------+') 设置初始属性 进入游戏后第一步就是设置初始属性,此处设定以下四个属性:  颜值(face)。 体制(strong)。 智力(iq)。 家境(home)。 我们规定每个属性的范围为1 - 10,并且这四个属性的总和不能超过20,如果玩家输入的初始属性不合理,则提示玩家输入有误并要求重新输入。体现在代码中就是,玩家输入属性后通过if语句判断输入的属性是否合法,如果不合法则通过while语句要求玩家重新进行输入。  代码如下:  # 设置初始属性 # 颜值、体质、智力、家境(总和不能超过20,每一项取值在1-10之间) while True:     print('请设置初始属性(可用点数总数为20)')     face = int(input('请输入颜值(1-10): '))     strong = int(input('请输入体制(1-10): '))     iq = int(input('请输入智力(1-10): '))     home = int(input('请输入家境(1-10): '))      if face < 1 or face > 10:         print('颜值设置有误!')         continue     if strong < 1 or strong > 10:         print('体制设置有误!')         continue     if iq < 1 or iq > 10:         print('智力设置有误!')         continue     if home < 1 or home > 10:         print('家境设置有误!')         continue     if face + strong + iq + home > 20:         print('属性总和超过了20,设置有误!')         continue      print('初始属性输入完毕!')     print(f'颜值: {face}, 体制: {strong}, 智力: {iq}, 家境: {home}')     break 设置角色性别 关于角色的性别,我们可以随机生成一个1 - 6的整数,类似于掷色子。  如果是单数,则性别设为男孩。 如果是双数,则性别设为女孩。 性别设置后需要借助一个变量将角色的性别保存起来,因为后续男孩和女孩可能会触发不同的事件。  代码如下:  # 设置角色性别 point = random.randint(1, 6) if point % 2 == 1:     gender = 'boy'     print('你是个男孩') else:     gender = 'girl'     print('你是个女孩') 说明一下:  代码中使用的randint是random模块中的一个函数,random.randint(begin, end)可以生成一个begin - end之间的随机整数。 在Python中,如果想引入其他模块,需要以import 模块名的方式将对应的模块导入进来,导入模块后以模块名.xxx的方式就能使用该模块中的函数或变量。 设置角色出生点 设置角色的出生点时,可以根据角色的家境分为四个档位:  10是第一档,加成最高。 7 - 9是第二档,有一些加成。 4 - 6是第三档,加成较少。 1 - 3是第四档,会扣掉属性。 除了将角色的出生点按照家境分为四个档位之外,还可以再生成一个随机数,对每一档的内部再进行一次细分,最终得到角色的出生点,此处涉及的也就是一些if条件判断而已。  代码如下:  # 设置角色出生点 point = random.randint(1, 3) if home == 10:     # 第一档     print('你出生在帝都, 你的父母是高官政要')     home += 1     iq += 1     face += 1 elif 7 <= home <= 9:     # 第二档     if point == 1:         print('你出生在大城市,父母是公务员')         face += 2     elif point == 2:         print('你出生在大城市,父母是企业高管')         home += 2     else:         print('你出生在大城市,父母是大学教授')         iq += 2 elif 4 <= home <= 6:     # 第三档     if point == 1:         print('你出生在三线城市,你的父母是医生')         strong += 1     elif point == 2:         print('你出生在镇上,你的父母是老师')         iq += 1     else:         print('你出生在镇上,你的父母是个体户')         home += 1 else:     # 第四档     if point == 1:         print('你出生在农村,父母是辛苦劳作的农民')         strong += 1         face -= 2     elif point == 2:         print('你出生在穷乡僻壤,你的父母是无业游民')         home -= 1     else:         print('你出生在镇上,你的父母感情不和')         strong -= 1 print(f'颜值: {face}, 体制: {strong}, 智力: {iq}, 家境: {home}') 说明一下:  角色的出生点不能仅由家境决定,此处在设置角色出生点时引入随机数的目的就是为了增加随机的因素,毕竟人生本来就充满了很多的随机性。 这里的代码只是起一个示意的作用,因此生成随机数的范围只是1 - 3,如果你愿意也可以生成更大范围的随机数,将每一档的内部进行更细粒度的划分,这样就能更大的保证每次运行程序后得到的出生点都是不一样的。 针对每一岁,生成人生经历 人生经历的四个阶段  设置完角色的性别和出生点后,就可以针对每一岁生成对应的人生经历了,这里我们按照年龄将人生经历分为以下四个阶段:  1 - 10岁:幼年阶段。 11 - 20岁:青年阶段。 21 - 50岁:壮年阶段。 50岁以后:老年阶段。 在人生的每个阶段都会有不同的经历和事件发生:  幼年阶段:可塑性强,体制、颜值、智力都会有较快的变化。 青年阶段:主要是求学,同时父母一辈会有明显变化,智力和家境会有明显变化。 壮年阶段:相对平稳,属性变化不大,主要是一些随机事件影响到属性。 老年阶段:体质、颜值、智力都会显著退化,并且随着年龄的上升,疾病和死亡的风险逐渐升高。 这时就可以发挥我们的想象力,编写一些合理的人生经历,并在合适的条件下触发这些事件即可。  人生经历生成  这里我们以幼年为例,简单演示一下处理逻辑:  使用for循环,按照年龄从1循环到10,每次循环生成对应年龄的人生经历。 在生成每一年的人生经历之前,先生成一个随机数(充当人生中的随机因素),根据得到的随机数以及角色的性别、年龄和各种属性来触发不同的事件。 不同的事件被触发后,可能会对角色的属性有正面或负面的影响,因此角色的各个属性会随着事件的触发而不断发生变化。 在这一年的最后打印出所触发的事件,为了方便观察,也可以将这一年后角色的各个属性进行打印。 代码如下:  # 幼年阶段 for age in range(1, 11):     info = f'你今年{age}岁, '     point = random.randint(1, 3)     # 性别触发的事件     if gender == 'girl' and home <= 3 and point == 1:         info += '你的家里人重男轻女思想非常严重, 你被遗弃了!'         print(info)         print('游戏结束!')         sys.exit(0)     # 体制触发的事件     elif strong < 6 and point < 3:         info += '你生了一场病, '         if home >= 5:             info += '在父母的细心照料下, 你康复了'             strong += 1             home -= 1         else:             info += '你的父母没精力管你, 你的身体状况更遭了'             strong -= 1     # 颜值触发的事件     elif face <= 4 and age >= 7:         info += '你长得太丑了, 别的小朋友不喜欢你, '         if iq > 5:             info += '你决定用学习填充自己!'             iq += 1         else:             if gender == 'boy':                 info += '你和别的小朋友经常打架!'                 strong += 1                 iq -= 1             else:                 info += '你经常被别的小朋友欺负'                 strong -= 1     # 智力触发的事件     elif iq < 5:         info += '你看起来傻傻的, '         if home >= 7 and age >= 6:             info += '你的父母把你送到更好的学校学习'             iq += 1         elif 4 <= home <= 6:             if gender == 'boy':                 info += '你的父母鼓励你多运动, 争取成为运动员'                 strong += 1             else:                 info += '你的父母鼓励你多打扮自己'                 face += 1         else:             info += '你的父母为此经常吵架'             if point == 1:                 strong -= 1             elif point == 2:                 iq -= 1             else:                 pass     # 健康成长事件     else:         info += '你健康成长, '         if point == 1:             info += '你看起来更结实了'             strong += 1         elif point == 2:             info += '你看起来更好看了'             face += 1         else:             info += '这一年没有特别的事情发生'     # 打印这一年发生的事情     print(info)     print(f'颜值: {face}, 体制: {strong}, 智力: {iq}, 家境: {home}')     print('---------------------------------------------')     # 为了方便观察, 加一个sleep     time.sleep(2) 说明一下:  代码中使用的exit是sys模块中的一个函数,如果角色因为触发某些事件而夭折,那么就可以以sys.exit(退出码)的方式让程序直接退出。 代码中使用的sleep是time模块中的一个函数,为了方便观察生成的人生经历,可以以time.sleep(秒数)的方式让程序暂停若干秒。 效果展示  说明一下:  由于当前代码中编写的人生经历还是比较少的,并且随机数也只是1 - 3,因此生成的人生经历的随机性比较差,并且生成的事件也就那么几个,如果想要让生成的人生经历更加随机更加丰富,就需要将生成随机数的范围调大,并且编写更多的人生经历用于触发。 此外,青年阶段、壮年阶段和老年阶段的人生经历生成方式与幼年阶段相同,这里就不再进行实现了,想象力比较丰富的博友可以自行编写,但博主认为这里的目的是为了熟悉Python的语法,继续编写其他阶段的人生经历的意义不大。 ———————————————— 版权声明:本文为CSDN博主「2021dragon」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/chenlong_cxy/article/details/127487860 
总条数:2474 到第 页
上滑加载中