首页 文章 精选 留言 我的

精选列表

搜索[python3],共1105篇文章
优秀的个人博客,低调大师

Python3获取本机公网ip(爬虫法)

今天试用了google的python在线编程工具colab,确实很好用,当时好奇在线环境的主机ip是多少? 在网上查了半小时的方法后, 都不好用,后来灵机一动,不如用爬虫来完成获取外网ip的任务,于是自己写了一个获取主机外网ip的脚本, 可行! import requests import re def get_ip_by_ip138(): response = requests.get("http://2017.ip138.com/ic.asp") ip = re.search(r"\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]",response.content.decode(errors='ignore')).group(0) return ip print("本机的ip地址为:",get_ip_by_ip138()) colab colab 相当于Jupyter notebook的在线版, 如果运行脚本时, 提示缺失requests库, 可以通过 !pip install requests 安装

优秀的个人博客,低调大师

Python3入门(十四)正则表达式

正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python自1.5版本起增加了re模块,它提供Perl风格的正则表达式模式。re模块使Python语言拥有全部的正则表达式功能。compile函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。 本文将给大家介绍Python中常用的正则表达式处理函数 一、正则表达式修饰符-可选标志 正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位OR(|)它们来指定。如re.I | re.M被设置成I和M标志 修饰符 描述 re.I 使匹配对大小写不敏感 re.L 做本地

优秀的个人博客,低调大师

Python3入门(三)基本数据类型

Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如: count = 10 name = "python" price = 12.5 也支持同时为多个变量赋值。例如 a = b = c = 1 e, f, g = 1, 2, 3 如果想删除一个变量,可以使用del,删除后将不能在进行调用,例如 a = b = c = 1 del a, b Python的数据类型 Number(数字) String(字符串) List(列表) Tuple(元组) Set(集合) dictionary(字典) 不可变数据(3 个):Num

优秀的个人博客,低调大师

如何使用python3读取Excel中的内容

1、关于Excel,我们都不陌生,但在开始操作之前,还是简单的在来了解下Excel的结构,工作簿的英文是BOOK(WORKBOOK),工作表的英文是SHEET(WORKSHEET) 一个工作簿是一个独立的文件 一个工作簿里面可以有1个或者多个工作表 2、使用python实现对Excel文件的读取,需要安装xlrd模块 3、excel数据中的sheet编号,行号,列号都是从索引0开始的 (Mac中的numbers文件可以导成Excel使用) import xlrd def read_xlsx(path): wb=xlrd.open_workbook(path) sheet_name=wb.sheet_names()#输出所有工作蒲中的工作表 print(sheet_name) # 通过sheet索引或者名称获取sheet data_sheet=wb.sheet_by_index(0) data_sheet1=wb.sheets()[0] print(data_sheet) print(data_sheet1) # 通过sheet获取行数 rowNum = wb.sheet_by_index(0).nrows; # 通过sheet获取列数 colNum = wb.sheet_by_index(0).ncols; print(rowNum) print(colNum) # 获取第一行的内容 print(data_sheet.row_values(1)) # 获取第一列的内容 print(data_sheet.col_values(3)) # 获取单元格内容 print(data_sheet.cell(9, 7).value) # 获取所有单元格内容 list = [] for i in range(rowNum): rowlist = [] for j in range(colNum): rowlist.append(data_sheet.cell_value(i, j)) list.append(rowlist) # 输出所有单元格的内容 for i in range(rowNum): for j in range(colNum): print(list[i][j], '\t\t', end="") print() #获取数据单元格的数据类型 # python读取excel中单元格的内容返回的有5种类型,即上面例子中的ctype: # ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error data_ctype=data_sheet.cell(4,8).ctype print(data_ctype)

优秀的个人博客,低调大师

Python3 与 C# 面向对象之~封装

最新彩版:https://www.cnblogs.com/dotnetcrazy/p/9202988.html 在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master在线预览:http://github.lesschina.com/python/base/oop/1.封装.html 这次尽量用故事模式来讲知识,上次刚说美化,这次算是第一篇了。步入正题: 1.定义一个类¶ 类的组成:类名、属性(没有字段)、方法 1.1创建一个类¶ In[1]: # 类名首字母大写 class Student(object): """创建一个学生类""" # 没有属性定义,直接使用即可 # 定义一个方法,方法里面必须有self(相当于C#的this) def show(self): print("name:%s age:%d"%(self.name,self.age)) In[2]: # 实例化一个张三 zhangsan=Student() # 给name,age属性赋值 zhangsan.name="张三" zhangsan.age=22 # 调用show方法 zhangsan.show() name:张三 age:22 In[3]: # 打印一下类和类的实例 print(Student) print(zhangsan) #张三实例的内存地址:0x7fb6e8502d30 <class '__main__.Student'> <__main__.Student object at 0x7fe961195b70> 和静态语言不同,Python允许对实例变量绑定任何数据 ==> 对于两个实例变量,虽然它们都是同一个类的不同实例,但拥有的变量名称可能都不同 说的比较抽象,举个例子就明了了: In[4]: xiaoming=Student("小明",22) xiaoming.mmd="mmd" print(xiaoming.mmd) # 小明和小潘都是Student类,但是小明有的mmd属性,小潘却没有 xiaopan=Student("小潘",22) print(xiaopan.mmd) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-500940527165> in <module>() ----> 1xiaoming=Student("小明",22) 2 xiaoming.mmd="mmd" 3 print(xiaoming.mmd) 4 5 # 小明和小潘都是Student类,但是小明有的mmd属性,小潘却没有 TypeError: object() takes no parameters 1.2使用__init__初始化赋值¶ 创建对象后,python解释器默认调用__init__方法,对必要字段进行初始化赋值 需要注意的是:__init__并不是C#中的构造函数,__new__ (后面会说) + __init__ 等价于构造函数 第一个参数和类的其他方法一样,都是self(相当于C#里面的this,表示创建的实例本身)调用的时候直接忽略它 In[5]: class Student(object): # 初始化赋值 def __init__(self,name,age): self.name=name self.age=age def show(self): print("name:%s age:%d"%(self.name,self.age)) In[6]: # 有了__init__方法,在创建实例的时候,就不能传入空的参数了 lisi=Student() --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-6-1ba88e24910b> in <module>() 1 # 有了__init__方法,在创建实例的时候,就不能传入空的参数了 ----> 2lisi=Student() TypeError: __init__() missing 2 required positional arguments: 'name' and 'age' In[7]: # 创建一个正确的实例 xiaowang=Student("小王",22) xiaowang.show() name:小王 age:22 1.3使用魔法方法__str__¶ 在print(类名)的时候自定义输出 这个有点像C#类里面重写ToString,eg: public override string ToString() { return "Name:" + this.Name + " Age:" + this.Age; } In[8]: # Python的__str__()方法 class Student(object): def __init__(self, name, age): self.name = name self.age = age # self别忘记写了,return也别忘了 def __str__(self): return "姓名:%s,年龄:%s" % (self.name, self.age) In[9]: lisi = Student("李四", 22) print(lisi) #现在打印就是你DIV的输出了 姓名:李四,年龄:22 1.4 私有属性、方法¶ C#、Java里面都是有访问修饰符的,Python呢? Python规定,如果以双下划线__开头的属性或者方法就是私有的 变量名类似xxx的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量。特殊变量是可以直接访问的,不是private变量 在说私有属性前,我们来个案例说说属性不私有的弊端,eg: 小明同学学了点C#,然后学习了上面的知识,心想 ~ Python这么搞安全性呢?不行,我得构造构造,于是有了下面的代码: In[10]: class Student(object): def __init__(self, name, age): self.name = name self.age = age def get_name(self): return self.name def set_name(self, name): self.name = name def get_age(self): return self.age def set_age(self, age): if age > 0: self.age = age else: print("age must > 0") def show(self): print("name:%s,age:%d" % (self.name, self.age)) 小明心想,想要修改age属性,你通过set_age我就可以判断了哇,还是本宝宝聪明 这时候小潘过来了,淡淡的一笑,看我怎么破了你 ~ 看代码: In[11]: zhangsan = Student("张三", -20) zhangsan.show() # name:张三,age:-20 zhangsan.age = -1 # set_age方法形同虚设,我完全可以直接访问字段了 zhangsan.show() # name:张三,age:-1 name:张三,age:-20 name:张三,age:-1 小潘傲气的说道~大叔,给你脸呢。我就是不去访问你设定的方法怎么滴呢? 小明急的啊,赶紧去找伟哥求经。不一会,傲气的贴出自己的New Code,心想着我私有属性都用上了还怕个毛毛: In[12]: class Student(object): def __init__(self, name, age): self.__name = name # 一般需要用到的属性都直接放在__init__里面了 # self.__age = age self.set_age(age) def get_name(self): return self.__name def set_name(self, name): self.__name = name def get_age(self): return self.__age def set_age(self, age): if age > 0: self.__age = age else: print("age must > 0") def show(self): print("name:%s,age:%s" % (self.__name, self.__age)) 小潘冷笑道~呵呵,然后使用了上次的绝招: In[13]: zhangsan = Student("张三", -20) zhangsan.__age = -1 # 同样的代码,只是属性前面加了下划线 zhangsan.show() age must > 0 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-13-82c41ff46846> in <module>() 1 zhangsan = Student("张三", -20) 2 zhangsan.__age = -1 # 同样的代码,只是属性前面加了下划线 ----> 3zhangsan.show() <ipython-input-12-1dec32486a19> in show(self) 22 23 def show(self): ---> 24print("name:%s,age:%s" % (self.__name, self.__age)) AttributeError: 'Student' object has no attribute '_Student__age' 这次小潘同志傻眼了,完全不能访问了啊?不行,怎么能被小明大叔笑话呢? 于是上网翻资料,国内不行就国外,外文不好就翻译,终于找到一个新破解方式: 双下划线开头的实例变量不能直接访问,是因为Python解释器对外把__age变量改成了_Studentage,所以,仍然可以通过**_Studentage**来访问: In[14]: # 搞事情 zhangsan._Student__age = -1 zhangsan.show() name:张三,age:-1 建议你不要这么干,不同版本的Python解释器可能会把__age改成不同的变量名 有些时候,你会看到以一个下划线开头的实例变量名,比如_age这样的实例变量,外部是可以访问的。 但是,请把它视为私有变量,不要随意访问(Python很多东西全凭自觉~捂脸@_@) 小潘终于长叹一口气,然后还不忘取笑小明同学~你这属性搞的,真麻烦,总是通过方法调用,太累了 <_> 鄙视! 这可把小明急的啊,学习的积极性都没有了,吃了碗牛肉面就去伟哥那边好好取经了~ In[15]: # 私有方法一笔带过 class Student(object): """私有方法""" def __go_home(self): pass zhangsan = Student() zhangsan.__go_home() # 访问不到 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-15-45c76191b808> in <module>() 7 8 zhangsan = Student() ----> 9zhangsan.__go_home() # 访问不到 AttributeError: 'Student' object has no attribute '__go_home' 1.5 装饰器,让方法像属性那样便利¶ Python内置的@property装饰器就是负责把一个方法变成属性调用的,来个例子 In[16]: class Student(object): def __init__(self, name, age): # 一般需要用到的属性都直接放在__init__里面了 self.name = name self.age = age @property def name(self): return self.__name @name.setter def name(self, name): self.__name = name @property def age(self): return self.__age @age.setter def age(self, age): if age > 0: self.__age = age else: print("age must > 0") def show(self): print("name:%s,age:%s" % (self.name, self.age)) In[17]: xiaoming = Student("小明", 22) xiaoming.name = "小潘" xiaoming.age = -2 xiaoming.show() age must > 0 name:小潘,age:22 把一个getter方法变成属性,只需要加上@property就可以了 @方法名.setter,负责把一个setter方法变成属性赋值 当然了,如果只想读 ==> 就只打上@property标签 小明同学高兴坏了,赶紧大吃了一顿~ 1.6 __del__ and __new__¶ 创建对象后,python解释器默认调用__init__() 方法 当删除一个对象时,python解释器也会默认调用__del__() 方法(有点析构函数的味道) 当有1个变量保存了对象的引用时,此对象的引用计数就会加1 当使用del删除变量指向的对象时,如果对象的引用计数不为1,那么每次删除计数减1,当计数为1的时候再调del就真把对象删了 这个可以结合我之前说过的链接来理解:于链接文件的探讨 看着老师夸夸其谈,小明愣了楞,摸摸肚子想到,真BB,我先搞个例子练练: In[1]: # 定义一个临时类 class Temp(object): def __del__(self): print("你被干掉了") 验证方面用编辑器比较合适,交互模式下可能不是真正的结果 # 对象被s1和s2引用 s1 = Temp() s2 = s1 del s1 # 只删除s1,新创建的对象并没有被删除 print("-" * 10) 输出:(最后的被干掉是程序退出了) # ---------- # 你被干掉了 如果用链接来解释就是这样的: 这次两个都删掉: t1 = Temp() t2 = t1 del t1 del t2 print("-" * 10) 输出: # 你被干掉了 # ---------- 都删了,自然就真删掉了 这样搞比较麻烦,我们引入一下获取引用个数:getrefcount(object也会占1个引用计数)来个案例: # 程序退出的时候,在他运行期间所有占用资源归还操作系统 # 引用计数 import sys t1 = Temp() print(sys.getrefcount(t1)) #(结果比实际引用大1)【object也会占1个引用计数】 t2 = t1 print(sys.getrefcount(t1)) print(sys.getrefcount(t2)) del t1 print(sys.getrefcount(t2)) # sys.getrefcount(t1)#被删掉自然没有了 del t2 print("-" * 10) 运行结果: 2 3 3 2 你被干掉了 ---------- 我再贴一种情况,你可以思考下为啥: t1 = Temp() t2 = Temp() del t1 del t2 print("-" * 10) 输出: # 你被干掉了 # 你被干掉了 # ---------- 小潘扭过头瞅了一眼说道:“大叔,你__new__忘记写案例了” 小明一愣神,立马反应过来说:“我这叫谋而后动~” 当你实例化一个对象的时候,就会执行new 方法里面的方法。new方法在类定义中不是必须写的,如果没定义,默认会调用object.new去创建一个对象 __new__方法中至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供 __new__方法中必须要有返回值(返回实例化出来的实例) 小明翻阅了官方文档,淡定的打下了如下标准格式的代码: In[3]: class Dog(object): def __init__(self, name): self.name = name print("初始化完毕") def __str__(self): return "Dog的名字叫:%s" % self.name def __new__(cls, name): # 注意参数,是cls,然后其他参数和init保持一致即可 print("创建对象完毕") # 别忘记写返回值哦 return object.__new__(cls) def main(): happy = Dog("Happy") print(happy) if __name__ == '__main__': main() 创建对象完毕 初始化完毕 Dog的名字叫:Happy 关于__name__在模块调用的时候会详细说,你可以先这样理解:如果直接运行py文件就执行,别人调用那么你的main就不执行了 标准写法: # 1.导入的模块 # 2.class的定义 # 3.其他方法定义 def main(): pass if __name__ == '__main__': main() 其他内容后面会继续说,封装部分再说说静态方法和类方法之类的就结束了(和C#还是有很大区别的) 1.7 类属性、实例属性¶ 小明问老师:“老师老师,怎么没有静态类,静态属性之类的东西呢?” 老师笑而不语道:“小家伙原来不仅仅是体重增加啊,这求知欲也是大大的增加呢 ~ 且听我慢慢道来” 类在程序里面也是对象(你姑且可以认为所有的类都类似于C#里面的静态类),而通过类实例化的对象,叫实例化对象 实例属性 --> 实例对象相互之间不共享 一般我们都是在__init__中定义 类属性(类似于C#里面的静态字段) --> 属于类对象,多个实例对象之间共享 注意一下:相同名称的实例属性将屏蔽掉类属性(尽量别同名) 类属性除了可以通过 类名.类属性 访问外,还可以直接 实例对象.类属性 (C#中抽象类和静态类是不能被实例化的) 来个案例更直观点: In[1]: class Person(object): # age为类属性 age = 1 def __init__(self, name): # name为实例属性 self.name = name def main(): # 类名.类属性 print(Person.age) xiaoming = Person("小明") # 对象.类属性 print(xiaoming.age) if __name__ == '__main__': main() 1 1 如果需要在类外 修改类属性,必须通过类对象去引用然后进行修改 如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性 如果通过实例对象去引用该名称的属性,实例属性会强制 屏蔽掉类属性,即引用的是实例属性,除非del了该实例属性才能正常访问类属性 你可以理解为,Python这么做只是为了方便你获取,该怎么修改还得怎么做。来看个案例: In[3]: class Person(object): # age为类属性 age = 1 def __init__(self, name): # name为实例属性 self.name = name def main(): # 类名.类属性 print(Person.age) # 通过对象.类属性修改 xiaoming = Person("小明") xiaoming.age = 100 print(xiaoming.age) # 其实,并没有修改成功,只是产生了一个同名age print(Person.age) # 对吧,类属性并没有被修改 # 通过类名修改 Person.age = 22 # 如果需要在类外修改类属性,必须通过类对象去引用然后进行修改 print(xiaoming.age) # 刚才已经创建一个同名age,所以现在显示的是刚才的值 print(Person.age) # 通过类名.类属性 就可以看到值被修改了 # 如果你还是不信,可以创建一个新对象看看 xiaopan = Person("小潘") print(xiaopan.age) # xiaoming实例对象想访问怎么办? # 除非del了该实例属性才能正常访问类属性 del xiaoming.age print(xiaoming.age) # 这时候访问的就是 类属性 了 if __name__ == '__main__': main() 1 100 1 100 22 22 22 1.8 实例方法、类方法、静态方法¶ 先说说 实例方法,实例方法第一个定义的参数只能是实例本身引用self,只能通过实例调用(就是我们之前用的 def func_name(self,xxx): ) 类方法:是类对象所拥有的方法,需要用修饰器@classmethod来标识,第一个参数必须是类对象cls,可以通过类或者实例直用 静态方法:定义静态方法使用装饰器@staticmethod,没有默认的必须参数,通过类和实例直接调用 静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过 类对象来引用(访问) 小明眼花缭乱的对老师说道,老师给我看几个案例吧: In[1]: class Dog(object): # 类属性 name = "小汪" # 实例方法 def __init__(self, age): # 实例属性 self.age = age # 打印看看 print("self id:%s" % id(self)) # 类方法 @classmethod def show_name(cls): # 访问类属性 cls.xxx print("我叫%s" % cls.name) # 打印看看 print("cls id:%s" % id(cls)) # 静态方法 @staticmethod def say_hello(): print("汪汪汪") def main(): # 类名方式访问 Dog.show_name() Dog.say_hello() # 类名的方式可以访问静态方法 # 实例对象方式访问 dog = Dog(2) dog.show_name() dog.say_hello() if __name__ == '__main__': main() 我叫小汪 cls id:94310818174200 汪汪汪 self id:140392216464016 我叫小汪 cls id:94310818174200 汪汪汪 一般都是这样用的(供参考): 实例方法:一般平时用的都是它 类方法:类方法用在模拟C#多个构造函数(Python里面不能有同名函数) or 你需要 对类属性、类方法操作之类的 静态方法:一般 都是独立功能,类似于函数,只不过在面向对象里面一般这么用 1.9 C#封装案例¶ C#面向对象比较优美,来个封装的案例基本上就搞定了: using System; namespace _1Encapsulation { public class Student { /// <summary> /// 字段 /// </summary> private int _age; /// <summary> /// 属性 /// </summary> public int Age { get { return _age; } set { if (value > 1) { _age = value; } } } /// <summary> /// 自动化属性 /// </summary> public string Name { get; set; } /// <summary> /// 自动属性必须要有get访问器 /// </summary> public string SNum { get; } private int _gender; public int Gender { set { _gender = value; } } /// <summary> /// 构造函数的名字必须与类名一致 /// 构造函数没有返回值也没有viod /// 默认自动生成一个无参构造函数,当有一个有参构造函数的时候无参构造函数便不会自动创建 /// </summary> public Student() { } /// <summary> /// 有参构造函数 /// </summary> /// <param name="name"></param> /// <param name="age"></param> public Student(string name, int age) { this.Name = name; this.Age = age; } /// <summary> /// this调用当前类的某个有参构造函数 /// </summary> /// <param name="name"></param> /// <param name="age"></param> /// <param name="gender"></param> public Student(string name, int age, int gender) : this(name, age) { this.Gender = gender; } /// <summary> /// 某个方法 /// </summary> public void Show() { Console.WriteLine("Name:" + this.Name + " Age:" + this.Age + "\n"); } public override string ToString() { return "Name:" + this.Name + " Age:" + this.Age; } } } 调用部分: using System; namespace _1Encapsulation { class Program { static void Main(string[] args) { Student s = new Student() { Name = "mmd", Age = 13, Gender = 1 }; s.Show(); Student s1 = new Student("dmm", 20); s1.Show(); Console.WriteLine(s); } } } 作者: 毒逆天 出处: https://www.cnblogs.com/dotnetcrazy 打赏: 18i4JpL6g54yAPAefdtgqwRrZ43YJwAV5z 本文版权归作者和博客园共有。欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接!

优秀的个人博客,低调大师

Python3 与 NetCore 基础语法对比(Function专栏)

Jupyter最新排版:https://www.cnblogs.com/dotnetcrazy/p/9175950.html 昨晚开始写大纲做demo,今天牺牲中午休息时间码文一篇,希望大家点点赞 O(∩_∩)O NetCore:https://github.com/lotapp/BaseCode/tree/master/netcore/1_POP/6func Python:https://github.com/lotapp/BaseCode/tree/master/python/1.POP/4.func_IO 在线演示:http://nbviewer.jupyter.org/github/lotapp/BaseCode/tree/master/python/notebook/1.POP/4.func 在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master 主要是普及一下Python基础语法,对比着Net,新手更容易上手。对比学习很有意思的,尤其是一些底层和思路 本来感觉函数要说的地方没多少,细细一规划,发现~还是单独拉出一篇说说吧,之后就进入面向对象了,函数还是有必要了解一下的,不然到时候Class里面的方法定义又要说了。 演示的模式一直在变,刚开始让大家熟悉一下VSCode,后来引入了ipython交互式编程的概念,现在就用前几天讲的Notebook来演示了(VSCode现在也有这个预览版的插件了) 直接跳到扩展系列:https://www.cnblogs.com/dotnetcrazy/p/9175950.html#ext 先从函数定义说起吧: # 定义一个空函数:(不写pass就报错了) #定义一个无参函数(注意缩进) #定义一个含参函数 扩:文档说明用""" 或者'''来定义,就是如下效果 #定义一个含默认参数(缺省参数)的函数 # 定义有返回值的函数 # 定义含有多个返回值的函数(利用了元组) 来个案例解释一下:(多返回值只是一种假象,Python函数返回的仍然是单一值~元组) 传多个参数系列:(上面那个多返回参数也可以返回一个list来实现类似效果) 引用传递(通过元组、列表实现):扩展有可变类型和不可变类型作为形参的对比 # 定义一个可变参数的函数(参数名字一般都是*args) 如果你需要传一个元组或者列表进去的话,可以 参数前面加* # 定义含关键字参数的函数:def default_kv_params(name,age=23, **kv): # 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple# 关键字参数允许你传入0个或任意个含key-value的参数,自动组装为一个dict 来个综合案例:def default_god_params(name,age=23,*args,**kv): 需要注意py里面的书写格式==》 先定义再调用 (Code参考) NetCore:(C#基础语法大家都很熟了,我贴一个注释的Code即可) VSCode里面如果也想像VS一样,///就生成注释==》请安装函数文档注释:XML Documentation Comments using System; using System.Collections.Generic; namespace _6func { class Program { static void Main(string[] args) { #region Base // # 定义一个空函数: Method(); // # 定义一个无参函数 GetName(); // # 定义一个含参函数 ShowInfos("李四", 22); // # 定义一个含默认参数(缺省参数)的函数 DefaultParam("张三"); // # 定义有返回值的函数 int result = DivHaveReturn(1, 2); Console.WriteLine($"计算结果为{result}"); #endregion // # 定义含有多个返回值的函数(利用了元组) var (sum, dvalue) = DivHaveReturns(1, 2); Console.WriteLine($"sum:{sum},D-value:{dvalue}"); // 传多个参数系列: // 引用传递(通过元组、列表实现):扩展有可变类型和不可变类型作为形参的对比 var list = new List<int>() { 1, 2, 3, 4, 5 }; Console.WriteLine(DefaultSomeParams(list)); Console.WriteLine(list.Count);//这就是引用传递的证明 // # 定义一个可变参数的函数(参数名字一般都是*args) Console.WriteLine(DefaultParams(1, 2, 3, 4, 5)); // # 定义含关键字参数的函数 直接传Dict } #region base /// <summary> /// 定义一个空函数 /// </summary> private static void Method() { } /// <summary> /// 定义一个无参函数 /// </summary> // private static void GetName() // { // Console.WriteLine("你好"); // } //简写 private static void GetName() => Console.WriteLine("你好"); /// <summary> /// 定义一个含参数的函数 /// </summary> /// <param name="name">名字</param> /// <param name="age">年龄</param> // private static void ShowInfos(string name, int age) // { // Console.WriteLine($"我叫{name} 我的年龄是{age}"); // } //简写 private static void ShowInfos(string name, int age) => Console.WriteLine($"我叫{name} 我的年龄是{age}"); /// <summary> /// 定义一个含缺省参数的函数 /// </summary> /// <param name="name">名字</param> /// <param name="age">年龄默认23</param> // private static void DefaultParam(string name, int age = 23) // { // Console.WriteLine($"我叫{name} 我的年龄是{age}"); // } //简写 private static void DefaultParam(string name, int age = 23) => Console.WriteLine($"我叫{name} 我的年龄是{age}"); /// <summary> /// 定义一个有返回值的函数(计算a+b,返回计算结果) /// </summary> /// <param name="a">num1</param> /// <param name="b">num2</param> // private static int DivHaveReturn(int a, int b) // { // return a + b; // } //简写 private static int DivHaveReturn(int a, int b) => a + b; #endregion /// <summary> /// 定义含有多个返回值的函数(利用了元组) /// 计算a+b的和,计算a-b,并返回两个结果 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> // private static (int sum,int dValue) DivHaveReturns(int a, int b) // { // return ((a+b),(a-b)); // } //简写 private static (int sum, int dValue) DivHaveReturns(int a, int b) => ((a + b), (a - b)); #region 传入多个参数系列 /// <summary> /// 利用列表实现,引用传递之类的C#还有ref和out,这边就不说了 /// </summary> /// <param name="nums"></param> /// <returns></returns> private static int DefaultSomeParams(List<int> numList) { int sum = 0; foreach (var item in numList) { sum += item; } numList.Clear(); return sum; } /// <summary> /// 定义一个可变参数的函数 /// </summary> /// <param name="args"></param> /// <returns></returns> private static int DefaultParams(params int[] args) { int sum = 0; foreach (var item in args) { sum += item; } return sum; } #endregion } } 函数 相关扩展: 1.递归函数:函数递归调用其实就是自己调用自己,关键点只要考虑什么时候跳出即可(没有跳出就是死循环) 先来个简单的案例熟悉一下: 来个案例(实际工作中并不会自己定义,用系统自带 strip方法即可) C#的递归我就引用一下以前的Code: https://github.com/dunitian/LoTCodeBase/blob/master/NetCode/1.面向过程/01.基础/10.递归案例/Program.cs 2.匿名函数系列:lambda 参数: 表达式 来个经常用的案例:data_list.sort( key=lambda x:x["key"]) 还有一个比较常用的地方:( 当参数传递) NetCore:上面Code中的简写都是用匿名函数的方式,可以参考 3.全局变量和局部变量 有人可能会说,这个就太简单了,没啥好说的,(⊙o⊙)… Python还真需要说说,来个案例给你猜结果: 直接看结果吧:发现 全局变量a木有被修改,而b修改了 还是来个简单案例说明下吧~ # 这是因为,python定义一个变量的写法不用加类型导致的(⊙﹏⊙) 所以函数里面a=200,python解释器就认为你定义了一个和a这个全局变量名字相同的局部变量,那怎么用呢?global来声明一下全局变量即可: 总结: # 在函数中不使用global声明全局变量不能修改全局变量==>本质是不能修改全局变量的指向,即不能将全局变量指向新的数据 # 对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量 # 对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量 下面就进入验证扩展系列,看看一些概念: # 之前很多资料说py3 匿名函数里不能调用print函数,自己测试下 # 可变类型与不可变类型的变量分别作为函数参数的区别 # 感到疑惑可以看之前的运算符扩展( https://www.cnblogs.com/dotnetcrazy/p/9155310.html#ext) # Python中函数参数都是引用传递# 对于不可变类型,因变量不能修改,所以运算不会影响到变量自身# 而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量 # 函数名能不能重复的问题(能不能 重载:具有不同的参数的类型或参数的个数【跟返回值没关系】) 结论:函数名不能重名 来两个有趣的扩展: 1.交换两个数熟悉吧,编程第一课,除了用 第三变量 或者 两数相加减 实现外,Python还有一种 新方式: a,b=b,a NetCore:这个我也是刚知道,O(∩_∩)O哈哈~还得谢谢评论区的兄弟^_^ 2.eval(和js里面的eval差不多):不太建议使用 先到这吧,有什么扩充的下面再贴吧~ 作者: 毒逆天 出处: https://www.cnblogs.com/dotnetcrazy 打赏: 18i4JpL6g54yAPAefdtgqwRrZ43YJwAV5z 本文版权归作者和博客园共有。欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文连接!

优秀的个人博客,低调大师

Python3开发简单应用——兽人之袭

​Python 是使用最广泛的动态编程语言之一。它支持一组丰富的包、图形用户界面(Graphical User Interface,GUI)库和Web框架,让你能够构建出高效的跨平台应用。它是一种理想的快速应用开发语言。如此快速的开发通常会带来一些问题,容易导致代码的整体质量、性能和扩展性的降低。本文将会告诉你处理此类情况的方法,并帮助你开发出更好的Python应用。 本文是摘自《Python应用开发实战》的导言部分,这是一个对Python编程的回顾。正因如此,希望你最好已掌握一些关于Python语言的知识,同时也了解面向对象编程(Object Oriented Programming,OOP)的概念。​ ​点击链接购买纸书 下面是本文内容的组织结构: 我们将从安装的先决条和搭建合适的Python开发环境开始。 为了给本书余下的部分定下基调,下一节将会对本书的高奇幻主题做一个简要介绍。 接下来是我们的第一个程序。这是一个简单的基于文本的奇幻游戏,它是一个Python脚本。 我们会给游戏增加一些复杂度,然后使用简单的函数开发出游戏的改善版本。 接下来,我们会逐渐给游戏增加更多的特性,并用面向对象的概念重新设计代码。 最后会简要提及Python的抽象基类(Abstract Base Class,ABC)。 代码解释会稍显冗余。有经验的读者可以跳过这些例子直接进入下一章,但要确保你已理解本书的主题,并复习一下ch01_ex03.py文件中的代码。 1.1 重要提示 在阅读本文余下的部分之前,让我们先来了解一些事项。如果你尚未了解,你应该阅读前言,其中记录了以下大多数事项: 每章都有各自的一组Python源文件。尽管我们会讨论大部分代码,但是要保证你的手上有相关源文件。 源代码可以从Packt Publishing的网站上进行下载。请参照前言中相关说明。 本书中的示例代码兼容Python 3.5.1版本。支持代码包也提供兼容Python 2.7.9的文件。 正如前文提到的,本书需要读者熟悉Python语言基础,并了解面向对象编程概念。 本书使用一个有趣的、基于文本的游戏主题作为工具来解释应用开发过程的各个方面,但是这本书本身并不是关于游戏程序开发的! 本书通常不提供练习题目(如果有的话)的解决方案。 本书中提供一些外部链接(Uniform Resource Locator,URL)可供读者进行扩展阅读。随着时间推移,某些链接可能会失效。如果出现这种问题,请尝试使用恰当的关键字到网上去搜索。 1.2 安装的先决条件 要确保已经安装了必要的软件。表1-1总结了本章和后续需要的一些基本工具。下一节中会有更详尽的安装说明。 表1-1 安装软件​ ​在接下来的章节中,我们需要安装一些其他的依赖软件。Python包管理器(pip)将会完成这项琐碎的工作。 你已经安装了Python的必要环境或者你已经知道如何安装了吗?如果是,那么请你跳过接下来的安装说明,直接进入本书的主题章节,开始真正的实践内容。 安装Python 安装Python有两种方法。你可以使用官方发行版本的Python或者任何一种可免费获取的捆绑发行版本。 1.方法1——官方发行版本 对于Linux或Mac用户来说,你的系统中可能已经安装了Python。如果没有,你可以使用系统中的包管理器进行安装。Windows用户可以通过Python官方网站下载Install Python来安装Python 3.5,如图1-1所示。​ 图1-1 如上面的安装截屏所示,在安装过程中,请确保选中“Add Python 3.5 to PATH”的选项。你也可以访问Python的官方网站来下载特定平台的发行版本。 2.方法2——捆绑发行版本 有很多Python免费发行版本,这些版本捆绑了很多实用的包,包括pip和IPython。表1-2总结了一些最流行的Python发行版本,其中包括官方发行版本。 表1-2 Python发行版本​ ​3.Python安装位置 让我们简单说说Python的安装位置,以及如何确保在你的终端窗口中 python 是一个可用的命令。当然,事情可能会因情况不同而各异,这取决于你的安装位置和你选择的Python发行版本。 Python的官方文档页面有丰富的关于在不同平台上安装Python的信息。一旦你有超出本书所涵盖内容的需求时,可以参考官方网站给你提供进一步的帮助。 类UNIX操作系统 在类UNIX操作系统如Linux中,典型的默认安装路径通常是/usr/bin/python 或者/usr/local/bin/python。 如果你使用系统中自带的包管理器安装Python,那么在终端窗口中是可以使用命令Python或者Python 3的。如果命令不可用,你需要更新系统环境变量PATH,使其包含Python的可执行文件路径。例如,你的系统中有Bash shell,在用户目录下的.bashrc文件中增加如下配置:​ ​用你的Python实际安装路径来替换/usr/bin。 Windows操作系统 在Windows操作系统中,典型的Python默认安装路径如下: C:\Users\name\AppData\ Local\Programs\Python\Python35-32\ python.exe。用你的Windows用户名替换name。根据安装文件和操作系统的不同,Python的安装路径也可能是Python 35-64。正如前面提到的,在安装的时候,你需要选择“Add Python 3.5 to PATH”,以保证Python或python.exe自动被识别为命令。另外,你也可以重新运行安装文件并选中该选项。 4.验证Python安装 打开终端窗口(或者是Windows操作系统中的命令提示符)并输入下面的命令来验证Python的版本。只有安装了Python并且该命令在终端窗口中是可用命令时,那么该命令才会生效。否则,需要指定Python可执行文件的全路径。例如,在Linux上,如果Python安装在/usr/bin下,你可以这样指定/usr/bin/python:​ 注意,上面的命令行中的$符号属于终端窗口,它并不是命令本身的一部分。也就是说,实际的命令只是python -V。在Linux的终端窗口中,对普通用户来说$或%是一个提示符。对root用户(管理员)来说,提示符是#。类似的,在Windows系统中,对应的符号是>。你要在这个符号的后面输入实际的命令。 如果我们运行上述命令,下面是一个可能的输出示例:​ ​5.安装pip pip是一个软件包管理器,它使得从官方的第三方软件库PyPI中安装Python包变得十分简单。pip在Python 2的2.7.9以上版本,以及Python 3的3.4以上版本中已经安装好了。如果你使用其他版本的Python,可以在https://pip.pypa.io/en/stable/installing中找到安装说明。 在Linux操作系统下,pip和Python可执行文件的默认位置是相同的。例如,如果Python安装在/usr/bin/python,那么pip的路径应该是/usr/bin/pip。在Windows操作系统下,pip.exe通常默认安装在如下位置:C:\Users\name\AppData\Local\Programs\Python\Python35-32\ Scripts\pip.exe。正如前文提到,用你的Windows用户名替换路径中的name。根据安装文件和操作系统的不同,Python的安装路径也有可能是Python 35-64。 6.安装IPython 这是一个可选的安装。IPython是一个增强版的Python解释器。如果你使用的发行版本没有捆绑它,那么你可以使用以下命令进行安装:​ ​安装完成后,在终端中输入ipython就可以启动IPython的交互shell。Anaconda Python 3.5发行版的IPython shell截图如下。 通常,使用Jupyter Notebook来书写和分享交互程序是非常方便的。它是一个Web应用程序,可以在交互环境下编写带有富文本、图片、函数等内容的Python代码。欲获取更多详情,请访问该项目的主页。Jupyter Notebook可以通过以下方式进行安装: 7.选择集成开发环境 选择IDE进行开发是个人的喜好问题。简单来说,IDE是一个旨在加快应用程序开发的工具。它通过对开发人员最常用的工具的集成,从而让他们能够来快速编写出高效的代码。Python安装时带有一个叫作IDLE的程序。这是一个基础的Python IDE,可供你入门时使用。对于高级的开发,你可以从众多免费的或商业的工具中选择一个。任何一款优秀的Python IDE至少都具有以下几个特点: 具有代码自动完成和语法高亮功能的代码编辑器。 具有可以浏览文件、项目、函数和类的代码浏览器。 具有可以交互识别问题的调试器。 集成版本控制系统,例如Git。 你可以尝试从一款免费的IDE开始。下面列出部分流行的IDE。如果你只对简单的源代码编辑器感兴趣,可以浏览https://wiki.python.org/moin/PythonEditors,表1-3提供了一些可供选择的编辑器。 表1-3 可选的IDE​ ​1.4 本书的主题 你读过诸如《指环王》或托尔金的《霍比特人》等奇幻小说吗?或者说看过根据这些小说改编的电影吗?那么,好,这是一本高奇幻的、托尔金式的关于Python应用开发的书籍。 更多关于J.R.R.托尔金的作品,请访问相关网站。高奇幻一词通常被用来代表交替虚幻世界中的一些列奇幻主题。 这本书带你来到一个虚构的世界,在那里你将开发一个基于上述主题的文本游戏。是的,即使在这个想象的世界里,你仍然可以继续成为一个开发人员!在阅读本书的过程中,将会有很多许多虚构的人物陪伴着你。当你学习Python开发的不同方面时,这些人物会跟你对话,问问题,提出新的功能,甚至与敌人打架。 应该指出的是,本书不是关于游戏应用程序开发的。本书只是使用一个简单的基于文本的游戏作为一种媒介,来学习Python开发的各个方面。 说一句题外话,如果你有兴趣玩一个高奇幻主题的游戏,那么你有相当多的选择。在诸多开源的项目中,《韦诺之战》是评价最高的、免费的、高奇幻主题的回合制策略游戏。请访问该游戏官网查看更多详情。 了解本书人物 让我们来认识一下本书各章节中那些会一直陪伴你的想象中的人物,参见表1-4。 表1-4 人物说明​ ​Foo先生 Foo先生是一个人类骑士,一个被描绘成守护着南部平原的大骑士。他是本书中的主要人物,并会在本书中一直与我们进行交谈​ ​兽人骑士 兽人是一个类似人类的想象中的动物。在这里,他被描绘成一个敌方的士兵。兽人的坐骑是一种类似于野猪的动物。在本章中,你就将遇到这个生物​ ​精灵骑士 精灵是一种超自然的神灵。精灵通常骑在一匹小马上。他被描绘成一个友好的伙伴。你会在第6章中遇到精灵先生​ ​仙子 仙子是拥有与生俱来的魔力而且十分聪明的仙女。她的魔法只在第7章(详见O(log n))中使用过一次,用来寻找她的魔法盒。你会在第6章中第一次遇到仙子​ ​侏儒 侏儒是一种矮小的、类似人类的神话中的存在。他被描绘成为Foo山的“大侏儒”。他问了很多问题。从本书第6章开始的后半部分里,你会看到侏儒的身影有了这个有趣的主题作为一个工具,让我们通过简单的命令行应用程序开始我们的Python之旅。这将是一个基于文本的游戏。在接下来几章中会增加一些复杂度,随之而来的一些有趣的问题会不断给你带来挑战。这本书将向你展示如何优雅地处理这种情况。 1.4 简单的脚本——兽人之袭V0.0.1 我们已经安装了必要的工具和开发环境,现在是时候来编写我们的第一个Python程序了。这是一个简单的靠碰运气取胜的游戏,同时也是一个命令行游戏。随着本书内容的不断推进,我们会给游戏增加更多的复杂度,通过学习到的新技术来开发更加高效的程序。所以,准备行动吧! 1.4.1 游戏简介——兽人之袭v0.0.1 在人类和他们的敌人之间的战争中,兽人就是第一个到来的敌人。一支巨大的兽人军队正在向人类的聚集地进发。他们几乎摧毁了行进道路上的一切。人类不同种族的首领们联起手来击败他们最强大的敌人,来共同为他们的伟大时代而战斗。人们都被召集起来参加了军队。Foo先生,一个保卫南部平原的勇敢骑士,穿过一片未知的茂密森林,开始长途跋涉,向东部进发。两天两夜,他小心翼翼地穿过茂密的树林。在路上,他发现了一个小的孤立定居点。因为疲劳的原因,再加上要希望补充粮食储备,他决定绕道而行。当他走进村庄时,他看见了五个木屋,如图1-2所示。周围没有发现任何人。犹豫之后,他决定走进其中一间木屋……​ ​1.4.2 问题说明 你正在设计一个简单的游戏,游戏中玩家需要为Foo先生选择一个木屋。这些木屋是随机被同伴或敌人占据的。同时,有些木屋仍有可能是空闲的。如果选择的是一个被敌人所占据的木屋,那么玩家就输掉比赛。如果是另外的两种场景,那么玩家就赢得比赛。 1.4.3 伪代码——0.0.1版本 现在游戏的目标已经明确了,请打开你最喜欢的编辑器,并记录下主要的步骤。通常这被称作伪代码。 当用户希望一直玩这个游戏时: 打印游戏的任务; 创建一个木屋的列表; 在5个木屋中随机分配敌人、同伴或空闲类型; 提示用户选择一个木屋的编号; 如果选中敌人占据的木屋,打印“你输了”; 否则,打印“你赢了”。 正如你所注意到的,代码的关键部分就是让同伴或者敌人随机占据木屋,并且保持剩下的木屋是未被占据的空闲状态。我们要如何实现呢?让我们用Python解释器来快速地解决这个问题。如果你安装了IPython,启动IPython解释器;否则,就通过在终端窗口中输入python命令来使用默认的Python解释器。首先,我们需要一个Python list来保存所有木屋占有者的类型。接下来,我们将使用内置random模块并调用random.choice来从列表中随机取得一个元素。代码如下面的屏幕截图所示:​ ​现在,我们只需要编写其他的条件代码即可。接下来,让我们来查看一下代码。 1.4.4 代码查看 从为本章提供的补充代码包中下载源代码文件 ch01_ex01.py 。文件扩展名 .py表明它是一个Python文件。在Python编辑器或你选择的一款IDE中打开它。建议在阅读以下讨论时,请保持随时能查看该文件。通常能够浏览完整的代码会让你更容易且更好地理解它。观察下面的代码片段,它只是上文提到的文件中的 if __name__ == '__main__' 条件代码块中的一小部分。 如果你安装的是Python 2.7.9的话,支持代码包中有一个单独的Python 2.7.9兼容源代码文件。 ​ ​让我们来看一下上面截图的代码片段。 前两行代码导入了两个内置模块,从而获得这些模块中提供的功能。textwrap 模块为命令行中的消息提供了很好的格式打印功能。 if条件块 if __name__ == '__main__' ,只有当该文件作为一个独立的脚本运行时才会被调用。换句话说,如果在其他文件中导入此文件,那么在条件块中的代码将不会被执行。 现在,让我们看看这个条件块中的代码。首先,我们会初始化一些变量。如前面所示的那样, occupants 列表存储了木屋占有人的类型。 最后几行代码只是对终端窗口中打印的文本进行格式化。变量 dotted_line 是一个字符串,它是由72个连字符组成的一条长线。 代码中的ASCII转义序列是用来用粗体打印文本。序列\033[1m表示使用粗体文本,\033[0m表示返回到正常的打印样式。 接下来的几行代码主要是在控制台中打印关于游戏的进一步信息:​ ​让我们看一看上面截图中的代码: 变量msg是一个非常长的变量。这也是textwrap被时常用到的地方。 使用textwrap.fill会让每行以72个字符长度的方式来对消息进行显示,长度是通过前面代码中定义的变量width来指定的。 现在,让我们来看看下面的while循环吧。 对于Python 2.7.9来说,在上面的第一个示例代码中唯一需要修改的是将调用内置函数input的地方替换成raw_input:​ ​ ​最外层的循环让玩家可以选择重新开始游戏。 通过使用 random.choice ,我们可以随机从 occupants 列表中挑选一个占有者,然后把它增加到小木屋的列表中。这个之前有过说明。 内置的input 函数用一个整数来接受用户选择的一个小木屋编号。变量 idx 用来存储一个数字。 接下来,通过打印明细来表明占有者的信息。最后,根据与小木屋编号对应的列表项来确定赢家。需要注意的是,huts 列表的索引是从0开始的。因此,根据选定的小木屋编号 idx 来取得相应的列表项时,我们需要使用 idx-1 作为列表的索引。 1.4.5 运行兽人之袭v0.0.1 假设你的系统环境变量PATH中已经包含了Python(可能是Python或者Python 3)的话,那么可以通过以下方式在命令行运行该程序:​ ​​仅此而已!请玩玩这个游戏,并尝试选择正确的木屋来解救Foo先生吧!下面的Linux终端窗口的快照显示了程序的运行情况:​ ​本文摘自《Python应用开发实战》​ ​《Python应用开发实战》 [美] 尼纳德·萨斯叶(Ninad Sathaye) 著著 ​点击链接购买纸书 用Python 3.5构建健壮的、可重用的、高效的应用程序 ;轻松奇幻的学习主线,解决Python开发中遇到的实际问题 本书使用一个生动有趣的、基于文本的游戏主题作为讲解内容来介绍Python应用开发过程的各个方面。全书共10章,涉及简单应用开发、模块化、打包和发布应用的代码、文档规范、单元测试、重构、设计模式、性能监测、性能优化、GUI应用、MVC框架等方方面面的软件开发知识和技能。 今日互动(限于微信端活动,活动地址:微信端点击参加) 你认为Python时最简单的编程语言吗?为什么?截止时间6月1日17时,留言+转发本活动到朋友圈,小编将抽奖选出3名读者赠送纸书1本和2张e读版电子书优惠券,(留言点赞最多的自动获得一张)。 异步图书后台回复“5月新书”进入新书交流群,获得第一手新书信息 推荐阅读 2018年5月新书书单(文末福利) 2018年4月新书书单 异步图书最全Python书单 一份程序员必备的算法书单 第一本Python神经网络编程图书 ​ ​​​长按二维码,可以关注我们哟 每天与你分享IT好文。 在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步e读版图书一本。赶紧来参加哦! 点击阅读原文,立即购书 阅读原文

优秀的个人博客,低调大师

Python3——创建Django项目的几种方法

Django是一种基于Python的Web开发框架 一、在命令行中创建Django项目(Windows平台、python3.6) 1、建立虚拟环境( 创建一个独立的Python运行环境 ) 为项目新建一个目录learning_log,在终端切换到这个目录,并创建虚拟环境 这里运行了模块venv,并使用它创建一个名为ll_env的虚拟环境 注意:如果python是较早版本,则先安装virtualenv( pip3 install virtualenv)然后再创建虚拟环境( virtualenv ll_env) 2、激活虚拟环境 命令激活:ll_env\Scripts\activate 命令停止使用虚拟环境:deactivate 3、在虚拟环境中安装Django 在虚拟环境中执行命令: pip3 install Django 4、在Django中创建项目 命令: django-admin.py startproject learning_log . (让Django新建一个名为learning_log的项目) 命令: dir和dir learning_log (显示文件中的目录文件) 5、创建数据库 命令: python manage.py migrate 6、查看项目 命令: python manage.py runserver 在浏览器中输入 http://127.0.0.1:8000/或者http://localhost:8000/ 二、在windows下使用Pycharm创建Django项目 环境:win7 python3.6 pycharm django pip3 1、安装django 2、配置系统环境 成功安装Django后,在Python根目录下的Scripts目录中可找到一个 django-admin.exe 文件,这是Django的核心管理程序,最好将它加入操作系统的环境变量中,这样在以后的调用会比较方便 Path环境变量中添加Scripts目录 回到cmd界面,运行 django-admin help ,能看到下面的内容表示环境变量设置成功 3、pycharm创建django项目 启动开发服务器 点击edit configurations,在host中填入127.0.0.1,port中填入8000。OK确定web服务就运行了 点击运行之后 三、搭建虚拟环境并在pycharm中创建项目 1、安装virtualenv 在Windows的CMD中,进入指定的目录,这里是 Django_course 。使用下面的方式,建立一个 mysite_env 虚拟环境 命令: virtualenv mysite_env 2、安装Django 进入 mysite_env 目录下的 Scripts 子目录,运行 activate 命令,激活该虚拟环境,此时的命令行提示符将以 (mysite_env) 开头。运行 pip3 install django 命令,自动安装最新版本的Django和唯一的依赖库pytz 如果需要退出虚拟环境,可以使用 deactive 命令 3、创建工程 按图示在左侧选择Django,然后将工程Location设置在虚拟环境同一级的目录内,也就是 E:\testcode\Django_course ,工程名字使用国际惯例mysite。在右侧的interpreter选择标处点选择,然后在弹出的界面中,找到我们刚才建立的虚拟环境所在位置,最后确定 这几种方法亲测有效,供参考! Django学习参考教程: https://code.ziqiangxuetang.com/django/django-views-urls.html https://www.cnblogs.com/feixuelove1009/p/5823135.html https://www.w3cschool.cn/django/

优秀的个人博客,低调大师

Python3快速入门——(9)生成器 (generator)

生成器 (generator) #生成器generator 在Python中,这种一边循环一边计算的机制,称为生成器,能节省大量的空间 L=[x*x for x in range ( 1 , 11 )] g=(x*x for x in range ( 1 , 11 )) #创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator next (g) #如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值 for n in g: #用for循环,generator也是可迭代对象 print (n) #举例:斐波那契数列(Fibonacci)除第一个和第二个数外,任意一个数都可由前两个数相加得到 #1, 1, 2, 3, 5, 8, 13, 21, 34, ... def fib(max): #fib函数是定义了斐波拉契数列的推算规则 n,a,b= 0 , 0 , 1 while n<max: print (b) a,b=b,a+b n=n+ 1 return 'done' #如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator def fib(max): #fib函数是定义了斐波拉契数列的推算规则 n,a,b= 0 , 0 , 1 while n<max: yield b a,b=b,a+b n=n+ 1 for x in fib( 7 ): print (x)

优秀的个人博客,低调大师

python3 asyncio异步新浪微博爬虫WeiboSpider

一些废话 之前写的用python3+urllib写的多线程微博(传送门),后面发现登录账号频繁被403,所以解决登录问题迫在眉睫。而且python的“多线程”并不那么多线程,最近因为刚需,需要稳定的微博爬虫,所以琢磨了一下使用selenium+aiohttp+redis写了一个使用asyncio的新浪爬虫。 简介 这里不多废话,大概介绍一下怎么做的。大致是: 登录 通过weibo.com登录界面登录,因为weibo.cn登录如果需要验证的话是要类似于解锁那样验证的,不好做。 而weibo.com只要输入验证码,而验证码可以通过yundama来验证,yundama也不贵,验证一次大概一分钱吧,登录成功后,在去访问weibo.cn,新浪会自行转换weibo.com的cookies到weibo.cn的cookies 然后把cookies保存在redis共享 抓取 使用了aiohttp,毕竟python的协程比多线程更给力,爬虫就是个频繁io的过程,自然用协程比多线程快了不少。 解析用的是bs4,解析后的数据放到kafka上,想存哪存哪~ talk is cheap, show you the code 这里就不说具体怎么做和使用了,README.md上有使用不走,感兴趣的看源码去吧。 github:https://github.com/zhujiajunup/WeiboSpider

优秀的个人博客,低调大师

Python3入门(六)迭代器和生成器

本文介绍如何在python中使用迭代器和生成器 一、迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next()。字符串,列表或元组对象都可用于创建迭代器示例: list1 = ["a", "b", "c"] # 创建迭代器对象 ll = iter(list1) # 输出下一个元素 print(next(ll)) # 输出:a 1、创建一个迭代器 把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(),

优秀的个人博客,低调大师

Python3源码—Code对象与pyc文件

8.1. Python程序的执行过程 Python解释器在执行任何一个Python程序文件时,首先进行的动作都是先对文件中的Python源代码进行编译,编译的主要结果是产生一组Python的byte code(字节码),然后将编译的结果交给Python的虚拟机(Virtual Machine),由虚拟机按照顺序一条一条地执行字节码,从而完成对Python程序的执行动作。 对于Python编译器来说,PyCodeObject对象才是其真正的编译结果,而pyc文件只是这个对象在硬盘上的表现形式,它们实际上是Python对源文件编译的结果的两种不同存在方式。 在程序运行期间,编译结果存在于内存的PyCodeObject对象中;而Python结束运行后,编译结果又被保存到了pyc文件中。当下一次运行相同的程序时,Python会根据pyc文件中记

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册