PYTHON 1. python 1.cmd(命令提示符)中输入python,进行程序编写
2.声明一个python文件,然后在该目录下python xx.py
执行python文件
3.pycharm编译
0x01: pycharm以及注释
0x02: 数据类型
1 2 3 4 5 6 7 8 9 10 11 12 数字(int、float、complex、bool) 字符串(str) 字典(dict) a = {} 元组(Tuple) b = () 列表(list) c = []
变量命名规则和c差不多
命名规范
0x03:python基本运算符 1 2 3 算术运算符: + - * / % ** 地板除://
1 2 3 #逻辑运算符: #and or not and 条件必须都为true返回true
0x04: 输入与输出 输出:
1 2 3 name = '张三' sex = 'male' print('我的名字是%s,是%s'%(name,sex))
1 2 3 4 格式化输出; 使用 format name = 'yuer' print('name:{}'.format(name))
输入:
1 name = input('pleast input your name:')
2.判断语句与循环控制 0x01:if-else语句 流程:计算机执行代码的顺序
流程控制:对计算机执行代码顺序的管理,只有流程控制才能实现在开发当中的业务逻辑
流程控制分类:顺序流程、选择(分支)流程、循环流程
选择流程:
1 2 3 4 5 6 7 8 9 10 11 12 13 双分支: if 条件表达式: ……………… else: ……………… 多分支: if 条件表达式: ……………… elif 条件表达式: ……………… else: ………………
条件表达式:比较运算符/逻辑运算符/复合运算符
1 2 3 4 5 6 7 a = int(input("请输入数字:")) if a >= 1: print("true") elif a == 0: print("false") else: print("a little true")
0x02:while循环 循环流程·:
1 2 3 4 5 while 条件表达式: 逻辑代码 for ... in 可迭代集合对象: 逻辑代码
while语法特点:
1.循环必须有一个初始值
2.必须有条件表达式
3.要有自增或自减变量,否则会死循环
4.循环次数不确定,依靠循环条件结束
5.主要用于判断
0x03:for循环 1 2 3 4 格式: for 临时变量 in 字符串、列表等: 执行代码 ……
语法特点:
1.遍历操作,依次地取集合容器中的每个值
适用于已知的循环次数(可迭代对象的遍历
eg:
1 2 3 4 tags='abcdefg' for item in tags: print (item) pass
range函数
此函数可以生成一个数据集合列表
1 2 3 range函数使用: range(起始值:结束:步长) 步长不能为0 range(1,100,1)
1 2 3 4 5 sum = 0 for i in range (1 ,101 ): sum += i pass print (sum )
for—else
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 k = key for i in range (1 ,10 ): if i == k: break pass else : print ("未找到key" ) pass username = 'yuer' password = '123' for i in range (3 ): zh = input ("账号:" ) pd = input ("密码:" ) if zh == username and pd == password: print ("登陆成功" ) break pass pass else : print ("账号或者密码错误,请重新登录" ) pass
0x04:break、continue 1 2 break退出循环 continue跳过本次循环,继续下一次循环
3.高级数据类型 1 2 3 4 5 6 7 8 9 10 序列:一组按照顺序排序的值(数据集合 在python中存在三种内置的序列类型:字符串、列表、元组 优点:可以支持索引和切片的操作 特征:第一个正索引为0,指向的是左端,第一个索引为负数的时候,指向的是右端 #切片是指截取字符串中的任意一段内容。 #使用方法:[起始下标:介绍下标:步长]切片截取的内容不包含结束下标对应的数据,步长指的是隔几个下标获取一个字符 下标会越界,切片不会
0x01:字符串 常用方法:
capitalize()
首字母变大写
endswith()/startswith()
是否->结束/开始
id()
查看变量内存地址
find()
检测x是否在字符串中
index()
检测x是否在字符串中
isalnum()
判断是否是字母和数字
isalpha()
判断是否是字母
isdigit()
判断是否是数字
islower()
判断是否是小写
join()
循环取出所有值得用xx去连接
lower()/upper()
大小写转换
swapcase()
大写变小写,小写变大写
lstrip()/rstrip()/strip()
移除左/右/两侧空白
split()
切割字符串
title()
把每个单词的首字母变成大写
replace(old,new,count=None)
替换字符,count为替换个数,无count表示全部替换
count()
统计出现的次数
1.常用方法使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 name = 'yuer' print ("my name is {}" .format (name.capitalize()))print ("my name is %s" %name.capitalize())a = ' yuer ' b = a.strip() c = a.lstrip() d = a.rstrip() a = '123' b = a print (id (a))print (id (b))a = 'cookie' print (a.find('o' )) print (a.index('o' ))a = 'yuer' print (a.startswith('y' )) print (a.endswith('r' )) a = 'CooKie' print (a.lower())print (a.upper())
2.切片操作 1 2 3 4 5 6 7 8 str = 'we need a pwner' print (str ) print (str [0 ]) print (str [3 :6 ]) print (str [3 :]) print (str [:2 ]) print (str [::-1 ])
0x02:列表 1 2 3 4 5 6 7 有序的数据集合 1.可以随时添加、删除和修改 2.数据是可以变化的(数据项可以变化,但地址不会改变 3.用[]表示列表类型,数据项之间用逗号分隔,注意:数据项可以是任何类型的数据 4.支持索引和切片来进行操作 用for循环可对列表进行遍历
列表定义:
方法:
append
在列表后面追加元素
len
输出列表中元素个数
count
统计元素出现的次数
extend
扩展,相当于批量添加
index
获取指定元素索引号
insert
在指定位置插入
pop
删除最后一个元素
remove
移除左边找到的第一个元素
reverse
反转列表
sort
列表排序
1.常用方法使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 li = [1 ,2 ,3 ,'yuer' ,'123' ] print (li) print (li[0 ]) print (li[1 :4 ]) print (li[2 :]) print (li[::-1 ]) print (li*2 ) print (li.index(20 )) print (li.index())li = [1 ,2 ,3 ,'yuer' ,'123' ] li.append(['yer' ]) li.append('111' ) li.insert(1 ,'插入数据' ) d = list (range (11 )) li.extend(d) li.extend(['123' ,234 ,'dc' ]) li = [1 ,2 ,3 ,'yuer' ,'123' ] li[0 ] = 'tom' li2 = list (range (10 ,51 )) del li2[0 ] del li2[1 :3 ] li2.remove(20 ) li2.pop(1 )
0x03:元组 tuple
1 2 3 4 5 6 元组:是一种不可变的序列,在创建之后不能做任何的修改 1.不可变 2.用()创建元组类型,数据项用逗号分隔 3.可以是任何的类型 4.当元组中只有一个元素时,要加上逗号,不然解释器会把元组当作元素处理 5.支持切片操作
元组创建:
1 2 a = ('123' ,123 ,'yuer' ,['111' ,111 ,'yer' ],('1' ,2 )) print (type (a))
1.简单操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 a = ('123' ,123 ,'yuer' ,['111' ,111 ,'yer' ],('1' ,2 )) for i in a: print (i,end=' ' ) pass print (a[0 ])print (a[1 :3 ])print (a[::-1 ]) print (type (a[3 ])) a = ('123' ,123 ,'yuer' ,['111' ,111 ,'yer' ],('1' ,2 )) print (a.count('yuer' )) a = ('123' ,123 ,'yuer' ,['111' ,111 ,'yer' ],('1' ,2 )) print (a.index('yuer' ))
1 2 3 4 5 6 tupleA = () print (id (tupleA))tupleA = ('adcd' ,11 ,22 ) print (id (tupleA))
0x04:字典 1 2 3 4 5 6 1.可以存储任意对象,以键值对的形式创建的{'key':'value'}利用大括号包裹,数据项用逗号分隔 2.字典中找某个元素时,是根据键、值字典的每个元素由2部分组成 3.在我们不确定字典中是否存在某个键而又想获取其值的时候,可以使用get方法,还可以设置默认值 4.字典中键不可重复,值可重复(如果有重复的键,后者会覆盖前者 5.字典的键只能是不可变类型:数字、字符串、元组等 6.不是序列类型,没有下标概念,不能使用索引,是python内置的高级数据类型
1.常用方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 a = {} print (type (a))a = {} a['name' ] = 'yuer' print (a)a = {'name' :'yuer' ,'sex' :'male' } print (len (a)) a = {'name' :'yuer' ,'sex' :'male' } print (a['name' ]) print (a.keys()) print (a.values()) print (a.items()) a = {'name' :'yuer' ,'sex' :'male' } a.update({'name' :'cookie' }) a.update({'age' :'18' }) a.add['name' ] = 'cookie' print (a)a = {'name' :'yuer' ,'sex' :'male' } del a['name' ] a.pop('name' ) print (sorted (a.items(),key=lambda d:d[0 ])) print (sorted (a.items(),key=lambda d:d[1 ]))
0x05:公用方法 1.合并操作 + 使用字符串、列表、元组
1 2 3 4 5 6 7 8 9 10 11 a = 'yuer' b = '123' print (a+b) listA = [1 ,2 ,3 ] listB = [7 ,8 ,9 ] print (listA+listB) tupleA = (1 ,2 ,3 ) tupleB = (4 ,5 ,6 ) print (tupleA+tupleB)
2.复制 * 字符串、列表、元组
1 2 3 4 5 6 7 8 a = 'yuer' print (a*3 )listA = [1 ,2 ,3 ] print (listA*3 )tupleA = (1 ,2 ,3 ) print (tupleA*3 )
3.in判断元素是否存在 字符串、列表、元组、字典
1 2 3 4 5 a = 'yuer' print ('a' in a) dic = {'name' :'yuer' } print ('age' in dic)
4.python函数基础 0x01:函数基础 函数定义:
1 2 3 4 5 def 关键字 小括号 : 代码块 def 函数名(参数列表): 代码块
函数说明文档:
函数内容的第一行可以用字符串进行函数说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def inform (): ''' 用于输出信息 :return: ''' print ("my name is {}" .format ('yuer' )) print ("my age is {}" .format (11 )) pass def inform (name,age ): ''' 自我介绍模板 ''' print ("my name is {}" .format (name)) print ("my age is {}" .format (age)) pass
0x02:函数参数 参数分类:
必选参数、默认参数(缺省参数)、可选参数、关键字参数
1 2 3 4 5 参数:函数为了实现某项特定功能,进而为了得到实现功能所需要的数据,为了得到外部数据 必选参数:在函数调用的时候必须要赋值 默认参数: # 定义函数学习参数
#必选参数 1 2 3 4 5 6 7 8 def sum (a,b ): sum = a + b print (sum ) pass a,b = map (int ,input ().split()) sum (a,b) sum ()
#默认参数 1 2 3 4 5 def sum (a=20 ,b=30 ): print ('默认参数的使用={}' .format (a+b)) pass sum ()
#可选参数(不定长参数 接受的数据是一个元组类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def sum (*args ): ''' 可变长的参数类型 累加 ''' print (args) pass sum (1 ) sum (1 ,2 ) def sum (*args ): sum = 0 for i in args: sum += i pass print (sum ) pass
#关键字可变参数 接受的数据是字典类型
1 2 3 4 5 6 7 8 9 10 11 def keyFunc (**kwargs ): print (kwargs) pass keyFunct(1 ,2 ,3 ) a = {'name' :'yuer' ,'age' :'11' } keyFunc() keyFunc(**a) keyFunc(name='peter' ,age=18 )
#组合使用 1 2 3 4 5 6 7 def comx1 (*args,**kwargs ): print (args) print (kwargs) pass comx1(age=18 )
0x03:函数返回值 *函数需要返回多个结果时,将要返回的值用逗号隔开,最终会返回一个包含所有返回值的元组
1 2 3 1.函数执行完以后会返回一个对象,如果函数的内部有return这个关键字,就可以返回实际的值,否则返回None 2.可以返回任意类型,取决于return关键字后面的元素的类型 3.给调用方返回数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def sum (a,b ): sum = a+b return sum a,b = map (int ,input ().split()) print ('a+b={}' .format (sum (a,b)))def hanshu (): return 1 ,2 ,3 print (hanshu()) def hanshu (): return {'name' :'yuer' } print (hanshu()) print (type (hanshu()))
0x04:函数嵌套 1 2 3 4 5 6 7 8 9 10 11 12 def fun1 (): print ("-----start------" ) print ("-----执行代码省略-----" ) print ("-----end-----" ) pass def fun2 (): print ("-----start-----" ) fun1() print ("-----end-----" ) pass
1 2 3 4 5 函数分类: 有参数无返回值 有参数有返回值 无参数无返回值 无参数有返回值
5.函数进阶 0x01:全局变量和局部变量 局部变量:
函数内部定义的变量(生效范围只在函数的内部,不同的函数可以定义相同的局部变量互不干扰,局部变量为了临时的保存数据,需要在函数中定义来进行存储
全局变量:
当全局变量和局部变量出现重复定义的时候,程序会优先执行使用函数内部定义的变量
如果在函数的内部想对全局变量进行修改的话,必须使用global关键字进行声明
修改全局变量:
1 2 3 4 5 6 7 8 name = 'yuer' def changeGlobal (): global name name = 'cookie' pass changeGlobal() print (name)
0x02:函数参数引用传值 不可变类型
int str 元组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 a = 1 print ("a的地址:{}" .format (id (a)))def func (x ): print ("x的地址:{}" .format (id (x))) x = 2 print ("x的地址:{}" .format (id (x))) pass func(a) print ("a的地址:{}" .format (id (a)))print (a)
可变类型
字典 列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 listA = [] def func (parms ): print (id (parms)) parms.append([1 ,2 ,3 ,4 ]) print (id (parms)) print ('内部的{}' .format (parms)) pass print (id (listA))func(listA) print ('外部的{}' .format (listA))
小结
1.在python中 万物皆对象,在函数调用的时候,实参传递的就是对象的引用
2.更好的把控 在函数内部的处理是否会影响函数外部数据的变化
3.参数传递是通过对象引用来完成
0x03:匿名函数 利用lambda
关键字创建匿名函数
1 lambda 参数1,参数2,参数3:执行代码语句
1.没有名字的函数
2.匿名函数冒号后面的表达式有且只有一个(是表达式,不是语句
3.匿名函数自带return
4.用变量接收匿名函数,用变量进行调用
5.但是只能是单个表达式,不是一个代码块,只是为了满足简单函数的场景,仅仅能封装有限的逻辑,复杂逻辑实现不了
eg:
1 2 3 4 5 6 7 8 9 a = lambda x,y:x+y print (a(1 ,2 ))d = lambda a,b,c:a*b*c print (d(1 ,2 ,3 ))
双分支变但分支:
1 2 b if a else c #如果a成立则返回b 否则返回c
结合:
1 2 3 jg = (lambda x,y:x if x>y else y)(1 ,4 ) print (jg)
0x04:递归函数 如果一个函数在内部不调用其他函数,而是自己本身的话,这个函数就是递归函数
递归函数必须有一个结束条件,否则递归无法结束
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 def func (x ): if x == 1 : return 1 ; else : return x * func(x-1 ) pass print (func(5 ))import os def findFile (file_path ): listRs = os.listdir(file_path) for item in listRs: full_path = os.path.join(file_path, item) if os.path.isdir(full_path): file_path(full_path) else : print (item) pass pass else : return pass
1.自己调用自己
2.必须有一个明确的结束条件
3.优点:逻辑简单,定义简单
4.缺点:容易导致栈溢出。内存资源紧张,甚至内存泄漏
6.内置函数 0x01:数学运算 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 abs() 求绝对值函数 返回数字的绝对值 round() 求近似值 pow() 求次方 divmod() 求商和余数 max() min() 最值 sum() 和 eval() 将字符串当作代码
0x02:类型转换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #数据类型的转换 int() float() str() #ascii码相互转换 ord() chr() bool() bin() hex() oct() 转成八进制 list() 元组转换成列表 tuple() dict() 创建字典 bytes()
dict()
字典操作(主要用于创建字典
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 dic = dict (name='cookie' ) print (type (dic))dic.update({'name' :'yuer' }) dic['age' ] = 18 print (dic)
bytes()
转为字节数组
1 2 3 4 5 6 7 8 9 10 11 12 print (bytes ('w我like python' ,encoding='utf-8' ))
0x03:序列操作 1 2 3 4 5 6 7 all() any() sorted() reverse() range() zip() enumerate()
all()
与的关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 def all (iterable ): for element in iterable: if not element: return False return True li = [] tup = () print (all (li)) print (all (li)) li = [1 ,2 ,3 ,False ] print (all (li)) tup = (1 ,2 ,0 ) print (all (tup))
any()
或的关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 def any (iterable ): for element in iterable: if element: return True return False li = [1 ,2 ,3 ,0 ] print (any (li)) li = [0 ,False ] print (ant(li)) li = ['' ,0 ,false]
sorted()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 li = [1 ,3 ,2 ,5 ,6 ,8 ] print (sorted (li)) print (sorted (li,reverse=True )) print (sorted (li,reverse=False )) li.sort() print (li)
reverse()
1 2 3 4 5 li = [1 ,3 ,5 ,7 ] li.reverse() print (li)
range()
1 2 3 range (start,stop[,step])
zip()
1 2 3 4 5 6 7 8 9 10 11 a = zip ([1 ,2 ,3 ],['a' ,'b' ,'c' ,'d' ]) print (list (a))s1 = ['a' ,'b' ,'c' ] s2 = ['你' ,'我' ,'他' ] print (list (zip (s1,s2)))
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 def printBookInfo (): books = [] id = input ("请输入图书编号: " ).split bookName = input ("请输入书名:" ) bookPos = input ("请输入位置:" ) idList = id .split(' ' ) bookNameList = bookName.split(' ' ) posList = bookPos.split(' ' ) bookInfo = zip (idList, bookNameList, posList) for item in bookInfo: ''' 遍历图书信息,进行存储 ''' dictInfo = {'编号' :item[0 ],'书名' :item[1 ],'位置' :item[2 ]} books.append(dictInfo) pass for i in books: print (i) pass pass printBookInfo()
enumerate()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 li = [1 , 2 , 3 , 4 , 5 , 6 ] for i in enumerate (li, start=0 ): print (i) for i, j in enumerate (li): print (i, j) dictA = {} dictA['name' ] = 'cookie' dictA['sex' ] = 'female' for i in enumerate (dictA): print (i) pass for i, j in enumerate (dictA): print (i, j, dictA[j]) pass
0x04:三元运算 1 result = 值1 if 条件 else 值2
0x05:set集合 set(集合)是python中的一种数据类型,是一个无序且不重复的元素集合
特点:
不支持索引和切片,是一个无序的且不重复的容器,类似于字典,但是只有key没有value
1 2 3 4 5 6 set1 = {'1' ,'1' } list1 = [1 ,4 ,2 ,5 ] se2 = set (list1)
集合操作函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 set1 = set () set1.add('python' ) print (set1)set1 = {'1' ,'2' ,'3' } set1.clear() print (set1)set1 = {'1' , '2' , '3' } set2 = {'3' , '4' , '5' } set3 = set1.difference(set2) print (set3)set1 = {'1' , '2' , '3' } set2 = {'3' , '4' , '5' } set3 = set1.intersection(set1, set2) print (set3)set1 = {'1' , '2' , '3' } set2 = {'3' , '4' , '5' } set3 = set1.union(set1, set2) print (set3)set1 = {'1' , '2' , '3' } set1.pop() print (set1)
7.面向对象 0x01:介绍 1 2 面向对象编程:将数据和函数绑定,进行封装,这样能够更快速地开发程序,减少重复代码的重写过程(关注设计思维 ————适合做大项目
类和对象
对象是类的实例
0x02:定义类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Person (object ): name = 'yuer' age = 18 def eat (self ): print ("吃饭" ) pass def run (self ): print () pass def sing (self ): print () pass a = Person() a.eat()
0x03:实例方法、属性、静态方法、类方法 实例方法:在类的内部,使用def关键字可以定义一个实例方法,与一般函数定义不同,类方法必须包含参数self
,且为第一个参数
属性:在类的内部定义的变量(类属性
实例属性:定义在方法里面使用self引用的属性称之为实例属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 class Person : native_place='' def eat (): print ("eat action" ) pass @staticmethod def method (): print ("静态方法" ) pass @classmethod def cm (cls ): print ("类方法" ) pass def __init__ (self ): self.name = '小明' pass p = Person()
0x04:魔术方法 python 魔术方法
常用的魔术方法
魔术方法
解释
__new__
在对象实例化的时候最先调用的方法
__init__
构造方法
__del__
析构方法
__call__
当对象被当作函数调用的时候自动调用此方法
__len__
当对象被当作len()调用的时候
__repr__
当对象被当作repr()调用的时候
__str__
当对象被当作str()调用的时候
__bytes__
当对象被当作bytes()调用的时候
__hash__
当对象被当作hash()调用的时候
__bool__
当对象被当作bool()调用的时候,应该返回true或false
__format__
当对象被当作format()调用的时候
__getattr__
当调用一个不存在的属性的时候执行的行为
__getattribute__
当该类的属性被访问时所执行的行为
__setattr__
定义当一个属性被设置时的行为
__delattr__
定义当一个属性被删除时的行为
__dir__
当对象被当作dir()调用时的行为
__get__
定义当描述符的值被取得时的行为
__reduce__
当定义扩展类型时(也就是使用Python的C语言API实现的类型),如果你想pickle它们,你必须告诉Python如何pickle它们。 reduce 被定义之后,当对象被Pickle时就会被调用。它要么返回一个代表全局名称的字符串,Pyhton会查找它并pickle,要么返回一个元组。这个元组包含2到5个元素,其中包括:一个可调用的对象,用于重建对象时调用;一个参数元素,供那个可调用对象使用;被传递给 setstate 的状态(可选);一个产生被pickle的列表元素的迭代器(可选);一个产生被pickle的字典元素的迭代器(可选)
简单运用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import _pickleimport base64class Person : name = '' age = 0 def __init__ (self ): self.name = 'ameuu' self.age = 18 print ("这是构造方法" ) def __del__ (self ): print ("这是析构方法" ) def __call__ (self, *args, **kwargs ): print ("对象被当作函数调用" ) def __getattr__ (self, item ): print ("调用了一个不存在的属性" ) if __name__ == '__main__' : try : student = Person() student() student.a except : print ("error" )
Pickle
的dumps
和loads
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import base64import _pickleclass User : name: "admin" is_admin: 0 pass print (_pickle.dumps(User()))print (base64.b64encode(_pickle.dumps(User())))usr = _pickle.dumps(User()) print (_pickle.loads(usr))