装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 函数装饰器装饰方法 函数装饰器装饰普通函数已经很容易理解了: @decorator def func():... 4)) 输出结果: (3, 4) 7 ------------------------------ (<__main__.cls object at 0x01DF1C50>, 3, 4) 7 让类称为装饰器 也就是说,self.func指向的不是对象方法,而是类方法,类方法不会自动传递实例对象 args中保存的参数列表是(3, 4),但是cls.method中多了一个self位置参数,使得3赋值给了self : (3, 4) 7 因此参数问题必须解决。 4)) print('-' * 30) # 带参装饰方法 class cls1: @Decorator(arg1=1, arg2=3, arg3=5) def method(self
一般情况下,用这种方式就可以了 def func(*args,**kwargs): pass func() 查看python源码 ? ': 18, 'name2': 'tom', 'age2': 20} #聚合 我们首先回忆一下Python代码运行的时候遇到函数是怎么做的,从Python解释器开始执行之后,就在内存中开辟里一个空间,每当遇到一个变量的时候 等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量回储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕 命名空间和作用域 命名空间一共分为三种 全局命名空间 局部命名空间 内置命名空间 内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的 ,调用f1,先打印'in f1'在调用f2,打印'in f2'在调用f3,打印'in f3' in f1 in f2 in f3 作用域 作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域
PyMySQL 是一个纯 Python 实现的 MySQL 客户端操作库,支持事务、存储过程、批量执行等。 PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。 This option defaults to true for Py3k. client_flag Custom flags to send to MySQL. SQL cursor.execute('SELECT * FROM `users`') # 获取单条数据 cursor.fetchone() # 获取前N条数据 cursor.fetchmany(3) 中操作mysql的pymysql模块详解 Python之pymysql的使用 ---- 原文地址: https://shockerli.net/post/py...
变量 python3中变量的定义是不固定类型的(动态),区分大小写 值类型 引用类型 不可变的(值类型) 可变的(引用类型) int (整型) list (列表) str (字符串) set (集合) 怎么改变了 如果字符串可以改变,那么可以使用索引值给字符串赋值"python"[0] = 'h' -----> 报错,会发现报错,是不行的。 乘方的表示法 :2**5 ----> 2的5次方=32 身份运算符 is / not is a = (1,2,3) b = (1,3,2) print(a is b) # 元组是不可变的 print(a == b) # 元组是有序的,值是不相等的 >>> False False # 集合 a = {1,2,3} b = {1,3,2} print(a==b) # 集合是无序的 ====> a,b,c=1,2,3 或者 (1,2,3) 当abc都相等的时候:a=b=c=1 或者 a,b,c=1,1,1 c=3 序列解包:就是当一个函数有多个返回值的时候,不需要使用一个变量接收到所有的返回值
self):pass # func3 静态方法 # func1 普通方法 对象和类绑定的过程 a = A() b = A() print(A.func1) # 3个地址都不一样 print(a.func1 静态方法 不是绑定方法 没有和对象或者类发生任何绑定关系 print(A.func3) print(a.func3) print(b.func3) 执行结果 1 普通方法,func1结果 <bound print(issubclass(D,B)) # 判断D是不是B的子类 print(issubclass(D,A)) # 判断D是不是A的子类 执行结果 True True True True 面向对象进阶 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本身状态或行为的一种能力(自省),它首先被程序语言的设计领域所采用,并在Lisp和面向对象取得了成绩 2 python python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) 反射 正常情况下如果可以拿到这个变量, 那么如有这个变量的字符串形式
面向对象编程 1.1 OPP 与 OOP 1.2 类的理解与定义 1.2.1 类的理解-类也是对象 1.2.2 类的定义 1.3 类和实例 1.4 数据封装 1.5 总结 2 访问限制 2.1 类的变量总结 3 小结 4 继承和多态 4.1 super() 函数 4.2 MRO 列表 4.3 super 原理 5 实例属性和类属性 6 使用 @property 7 参考资料 8 其他 本文主要参考廖雪峰的《Python3 Python3 继承的核心原则有以下两条: 子类在调用某个方法或变量的时候,首先在自己内部查找,如果没有找到,则开始根据继承机制在父类里查找。 根据父类定义中的顺序,以深度优先的方式逐一查找父类! MRO 列表的顺序是通过一个 C3 线性化算法来实现的,这里我们不去深究这个算法,感兴趣的读者可以自己去了解一下,总的来说,一个类的 MRO 列表就是合并所有父类的 MRO 列表,并遵循以下三条原则: 参考资料 《廖雪峰-Python3教程》 Python中下划线的5种含义 面向对象的三大特性(封装、继承、多态) Python 类属性和类方法 彻底搞懂python super函数的作用 封装、继承和多态
var 立即前往 = " http://icourse8.com/Python3_pcjqjj.html "; 章节信息 第1章 课程简介(本课程基于py3.x并赠送py2.x的讲解) 第2章 数据结构与算法相关问题与解决技巧 第3章 复杂场景下字符串处理相关问题与解决技巧 第4章 对象迭代与反迭代相关问题与解决技巧 第5章 文件I/O效率相关问题与解决技巧 第
1, 1, 1, 4, 2, 5, 3, 2, 3, 5, 1, 2, 5] #计算频度最高的是三个数 c = Counter(data) print(c.most_common(3)) #[ (1, 5), (3, 4), (2, 4)] 1.7.如何快速找到多个字典中的公共键 # 1.7.如何快速找到多个字典中的公共键 from random import randint,sample from functools import reduce d1 = {k:randint(1,4) for k in sample('abcdefgh',randint(3,6))} d2 = {k: randint(1,4) for k in sample('abcdefgh',randint(3,6))} d3 = {k:randint(1,4) for k in sample('abcdefgh ',randint(3,6))} #1.使用字典的keys()方法,得到一个字典keys的集合 #2.使用map函数,得到每个字典keys的集合 #3.使用reduce,取所有字典keys集合的交集
__, __repr__ 示例 class List: def __init__(self, *args): self.l = list(args) l = List(1,2,3,4,5 ) # 每一个对象, 都有__str__方法 print(l) print(str(l)) print('%s' % l) 执行结果 [1,2,3,4,5] [1,2,3,4,5] [1,2,3,4,5 ) print(str(l)) print(repr(l)) 执行结果 [__str__:1,2,3,4,5] [__repr__:1,2,3,4,5] 总结 当需要使用__str__的场景时找不到 = B() print(a == b) 执行结果 True ==是由__eq__的返回值来决定的 __del__析构方法:析构方法,当对象在内存中被释放时,自动触发执行 注:此方法一般无需定义,因为python 程序员在使用时无需关心内存的分配和释放,因为此工作都是交给python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
Python的基本类型 ? Number:数字 int 和 float python3中的整型只有int,小数只有float.。type函数可以用来查看类型。 “helloworld"[-5:]得到"world” a = ‘hello’ a[0]=’g’ 错误,'str' object does notsupport item assignment python in,not in 3 in [1,3,6] 表达式为True 7 not in (1,3,5)表达式为True 集合set(无序) 不支持下标索引,不支持切片 不重复 支持len函数 、in、not in 空集合set(),type({})为dict,type(set())为set 运算: 差集-: {1,2,3,4,5,6} – {3,4} 得到 {1,2,5,6} 交集&: {1,2,3,4,5,6}&{3,4,7}得到 {3,4} 并集|: {1,2,3,4,5,6}|{3,4,7} 得到{1, 2, 3, 4, 5, 6,
1.动态参数: def func(*args): #在形参位置*叫做聚合 print(args) #元组形式 func(1,2,3,4,5,6) def func(**kwargs ): # 动态关键字参数 print(kwargs) func(a=1, b=2, c=3) # 关键字的形式传参 *args 和 **kwargs 是可以更换的,但是程序员约定都用它 _doc_)查看注释 3.名称空间 1. 内置空间中所有代码——内置空间 2. 自己写的py文件——全局空间 3. def func(*args): #在形参位置*叫做聚合 print(args) #元组形式 func(1,2,3,4,5,6) def func(**kwargs): # 动态关键字参数 print(kwargs) func(a=1, b=2, c=3) # 关键字的形式传参
直接的素数 pn = PrimeNumbers(1, 30) for n in pn: print(n) 3.3.如何进行反向迭代以及如何实现反向迭代 反向迭代 In [75]: l = [1,2,3,4,5 ] In [76]: for x in l: ...: print(x) ...: 1 2 3 4 5 In [77]: for x in reversed(l): ...: print(x) ...: 5 4 3 2 1 要想实现反向迭代必须实现__reversed__方法 #3.3.如何进行反向迭代以及如何实现反向迭代 class IntRange
--欧美专区----") def japan(): print("----日韩专区----") @login def henan(vip_level): if vip_level < 3:
计算的是整个数组的大小,单位是字节 &数组名,这里的数组名表示整个数组,取出的是整个数组的地址 接下来是一些笔试题: #include <stdio.h> int main() { int a[] = { 1,2,3,4 [4] = { 0 }; printf("%d\n", sizeof(a));//3*4*4 = 48 printf("%d\n", sizeof(a[0][0]));//4 printf("% *a --> *(a+0) --> a[0] printf("%d\n", sizeof(a[3]));//16 a[3] --> int[4] return 0; } 对于以上代码中最后一行代码 [2] = { (0, 1), (2, 3), (4, 5) };//这个二维数组里是逗号表达式,如果想把0,1放在第一行,要用{ },所以二维数组中存的是1,3,5,0,0,0 int* p; p ;//ER printf("%s\n", *cpp[-2] + 3);//ST *cpp[-2]+3 --> **(cpp-2)+3 printf("%s\n", cpp[-1][-1] + 1
前言 这篇博客提及三个关于python循环的优化细节,如有其他一些优化的方案,欢迎留言分享~QWQ 合理使用生成器(generator)和yield 在谈这个环节之前,我们先回顾一波何为生成器及何为yield 但是你只能迭代它们一次.原因很简单,因为它们不是全部存在内存里,它们只在要调用的时候在内存里生成,下面看两个例子: 1、生成器 >>> mygenerator = (x*x for x in range(3) print(i) ... 0 1 4 >>> 2、list列表 >>> listTest = [x*x for x in range(3)] >>> for i in listTest: ... mylist = range(3) ... for i in mylist: ... "brange size:") print(sys.getsizeof(arange)) t2 = time.time() print("arange time:") print(t2-t1) t3
1.1.如何在列表中根据条件筛选数据 # 1.1.如何在列表中根据条件筛选数据 data = [-1, 2, 3, -4, 5] #筛选出data列表中大于等于零的数据 #第一种方法,不推荐 res1 append(x) print(res1) #第二种用列表解析,推荐使用 res2 = [ x for x in data if x >= 0] print(res2) #第三种用filter函数 res3 = list(filter(lambda x : x>= 0,data)) print(res3) 1.2.如何在列表中根据条件筛选数据 # 1.2.如何在列表中根据条件筛选数据 from random .如何在集合中根据条件筛选数据 from random import randint s = {randint(0,20) for _ in range(20)} print(s) #筛选出能被3整除的数 s1 = {x for x in s if x % 3 == 0} print(s1) 1.4.如何为元祖中的每个元素命名,提高程序可读性 如下元祖,通过函数判断年龄和性别,但是这样代码可读性很差,
__new__(cls, f_it) int_t = IntTuple([1, 8, -2, -3, 'abc', [4,5], 10]) print(int_t) #(1, 8, 10) 5.2
4.1.如何读写csv数据 爬取豆瓣top250书籍 import requests import json import csv from bs4 import BeautifulSoup books = [] def book_name(url): res = requests.get(url) html = res.text soup = BeautifulSoup(html, 'html.parser') items = soup.find(class_="gr
模块+静态文件 Flask(__name__,...) 2、路由系统 装饰器实现的 @duo.route('/index',methods=['GET']) 3、 url_for('index',nid=1)) #有参数要加参数 return "hello world" if __name__ == '__main__': duo.run() 3、 session.get('user') : return None return redirect('login') # 上面不通过,返回登入页面 -基本数据类型:可以执行python
int a[] = {1,2,3,4}; printf("%d\n",sizeof(a+0)); a并非单独放在sizeof内部,也没有&,所以数组名a是数组首元素的地址,a+0还是首元素的地址。 int a[] = {1,2,3,4}; printf("%d\n",sizeof(*a)); a并非单独放在sizeof内部,也没有&,所以数组名a是数组首元素的地址. int a[] = {1,2,3,4}; printf("%d\n",sizeof(a+1)); a并非单独放在sizeof内部,也没有&,所以数组名a是数组首元素的地址,a+1就是第二个元素的地址。 {1,2,3,4}; printf("%d\n", sizeof(&a)); &a - 是取出数组的地址,但是数组的地址也是地址,是地址就是4/8个Byte。 int a[] = { 1,2,3,4 }; printf("%d\n", sizeof(&a[0])); &a[0]是首元素的地址, 计算的是地址的大小 4/8 个字节。