python开发 day4
一: 回顾字符编码 在 Python2 中 py2里默认编码是ascii 文件开头那个编码声明是告诉解释这个代码的程序 以什么编码格式 把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的,不过即使是2进制流,也可以按不同的编码格式转成2进制流,你懂么? 如果在文件头声明了#_*_coding:utf-8*_,就可以写中文了, 不声明的话,python在处理这段代码时按ascii,显然会出错, 加了这个声明后,里面的代码就全是utf-8格式了 在有#_*_coding:utf-8*_的情况下,你在声明变量如果写成name=u"中国",那这个字符就是unicode格式,不加这个u,那你声明的字符串就是utf-8格式utf-8 到 gbk怎么转,utf8先decode成unicode,再encode成gbk
# _*_ coding:utf-8 _*_ name = "中国" name2 = u"中国" print(name) print(name2) print([name,name2]) 结果为: 中国 中国 ['\xe4\xb8\xad\xe5\x9b\xbd', u'\u4e2d\u56fd']//* name2 = u"中国" # 指的是将字符编码转换为unicode
2: 怎样将utf-8 转换为 gbk , utf8先decode成unicode, 再encode成gbk
第一步:utf8先decode成unicode
name = "中国" print([name.decode("utf-8")]) 结果 [u'\u4e2d\u56fd']第二步: unicode 再encode成gbk
name = "中国" print([name.decode("utf-8").encode("gbk")]) 结果: ['\xd6\xd0\xb9\xfa'] 在 Python3 中 问题一:在文件中的中文字是什么编码那? py3里默认文件编码就是utf-8,所以可以直接写中文,也不需要文件头声明编码. 你声明的变量默认是unicode编码,不是utf-8, 因为默认即是unicode了(不像在py2里,你想直接声明成unicode还得在变量前加个u), 此时你想转成gbk的话,直接name.encode("gbk")即可。 我们知道 utf-8 是不能直接encode 成 gbk 的 所以需要 先将utf-8 转成unicode 再encode 成 gbk name = "中国" print(name.encode("gbk")) 结果 b'\xd6\xd0\xb9\xfa'神奇的事情发生了,没有报错,直接 encode 成了 gbk 了,所以可以判定,Python3 中变量的编码是unicode,而且在Python中也没有decode 这个方法,直接可以将数据转换为其他格式
Python的文件格式是UTF-8, 而将数据导入到内存中后,数据的编码就会被转换成 unicode ,为什么要转换为 unicode 因为 windows 默认编码为 gbk ,其他国家的windows 的编码也是各部相同,linux的默认编码为 utf-8 ,所以在内存中 Python3 转换为 unicode ,就可以支持所有平台的格式了。
简言之,就是在Python3中,数据在文件中个编码格式为 utf-8 ,而在内存中数据就是 unicode 的了
问题二:Python3 在 encode 的时候数据变成了bytes ? 在py3里,你在name.encode("gbk")时。结果在开头的引号前面出现了个b,表示是bytes格式。也就是说在encode的时候出数据变成了bytes格式。这是因为在py3里,str 和 bytes做了明确的区分,可以理解为bytes就是2进制流。之所以看到的不是二进制,是因为 python 为了能让用户对数据进行操作,而在内存级别进行了一层封装,否则让你直接看到一堆2进制。 在py2里好像也有bytes。不过 python2 里的bytes只是对str做了个别名 (python2里的str就是bytes, py3里的str是unicode),也就是说在Python2 中 bytes 就是str。没有像py3一样给你显示的多出来一层封装,但其实其内部还是封装了的。 这么讲吧, 无论是2还是三, 从硬盘到内存,数据格式都是 010101二进制到-->b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes类型-->按照指定编码转成你能看懂的文字 总结: python2 str = bytes python3 str = unicode 和 bytes //* bytes被独立出来了 Python3 bytes = python2 bytes //* bytes 就是一个二进制流 py3 默认文件编码utf-8 , 变量的编码是unicode 二进制 --> bytes --> 字符编码的格式 问题三:编码到底有啥用 ?编码应用比较多的场景应该是爬虫了,互联网上很多网站用的编码格式很杂,虽然整体趋向都变成utf-8,但现在还是很杂,所以爬网页时就需要你进行各种编码的转换.
问题四:为什么在 python2 中不使用 unicode 哪?python的第一个版本是在1989年发明,第一个公开发行版发行于1991年,而unicode是在1994年正式公布,所以Python2是肯定是没有赶上的。但是数据的使用必须要有一个格式,所以借鉴了C语言的bytes
二:函数上节课复习:
为什么使用函数之模块化程序设计不使用模块化程序设计的缺点:
1. 体系结构不清晰,可读性差
2. 可扩展性差
3. 程序冗长
模块话设计就是,将程序中相同的功能提取出来,做成一个函数的形式。将杂乱无章的程序结构化。
定义函数 def func(args): '''文档中写入文档描述''' 函数体 return 返回值 定义函数的三种形式1):无参函数
def func(): print("123456")2):有参函数
def func(x,y): print(x+y)3):空函数
def put(): pass # 一般应用,是在实现功能时,细分成众多子功能,子功能就使用空函数代替,先写出功能的架构,在实现母功能下的子功能。 调用函数1):语句形式:
def foo(): print('123456') foo()2):表达式的形式
def my_max(x,y): if x > y: return x else:return y res = my_max(1,2) # 将函数的执行结果付给res res = 10*my_max(1,2)3):作为另一个函数的参数
def my_max(x,y): if x > y: return x else:return y my_max(1,my_max(2,3)) 函数的返回值 不返回 def foo(): pass res=foo() print(res) 返回一个 def foo(): return 1 res=foo() print(res) 返回多个 def foo(): return 1,'s',[1,2,3] res=foo() print(res) 函数的参数形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值


全局与局部变量
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。其他解释请看下面代码 1 #从实参的角度 2 def foo(x,y): 3 print(x,y) 4 5 foo(1,2) #按位置 6 foo(y=2,x=1) #按照key=value关键字形式 7 8 #针对同一个形参,我们要么按照位置要么按照关键字为形参传值 9 foo(1,x=1,y=2) 10 11 #按照位置必须 12 foo(y=2,1) #错误 13 14 15 #从形参的角度:位置参数,默认参数,可变长参数,**kwargs 16 def foo(x,y,z): #位置参数:必传值参数 17 print(x) 18 print(y) 19 print(z) 20 21 foo(y=2,x=1,z=3) 22 23 24 def foo(x,y=1): #默认参数 25 print(x) 26 print(y) 27 # foo(1,2) 28 foo(1) 29 30 def sql(cmd,type='select'): 31 if type == 'select': 32 print('select function') 33 elif type=='insert': 34 pass 35 36 sql('select * from mysql.user') 37 38 def auth(user,passwd,group='default',project='default'): 39 pass 40 auth('tom',123) 41 42 #-------------------*args 43 def foo(x,y,*args): 44 print(x) 45 print(y) 46 print(args) 47 # foo(1,2,3,3,4,4,4,4) 48 49 l=['a','b'] 50 foo(1,2,*l) #*args的形式就等于1,2,3,4,5 51 foo(1,2,'a','b') #*args的形式就等于1,2,3,4,5 52 53 54 def foo(x,y,z): 55 print(x) 56 print(y) 57 print(z) 58 59 # foo(1,2,3) 60 l=[1,2,3,4] 61 foo(*l) #foo(1,2,3,4) 62 63 def foo(x,**kwargs): 64 print(x) 65 print(kwargs) 66 67 foo(1,y=3,z=1) 68 dic={'a':1,'b':2} 69 foo(1,**dic) #foo(1,a=1,b=2) 70 71 def foo(x,y,z): 72 print(x,y,z) 73 74 foo(**{'z':1,'y':2,'x':3}) #foo(z=1,b=2,x=3) 75 76 77 78 79 #位置参数-》默认参数,*args,**kwargs 80 def func(x,*args,y=3): 81 print(x,args,y) 82 83 func(100,200) 84 85 86 def func(x,*args,**kwargs): 87 print(x) 88 print(args) 89 print(kwargs) 90 91 #需要记住的一点 92 ''' 93 *sym 等同于 展开按照位置的方式去写 94 95 **sym 等同于吧sym展开按照关键字的方式去写 96 97 ''' View Code 三:函数式第一类对象 函数式第一类对象的意思就是函数可以当做数据来传递(函数在没有被调用前,在内存中就是一堆的字符串,在被调用时Python会先检查函数内是否存在语法错误。简单来说,函数可以看做为一个变量,也就是说变量的特性,函数都有,如下解释) 可以被调用 def func(): pass res = func res() 可作为参数(高阶函数) def func(): print("123456") def foo(x): x() foo(func) # 函数调用函数,高阶函数其实就是函数式第一类对象的概念 返回值可以是函数(高阶函数) def func(): print("123456") def foo(): return func() res = foo()可作为容器的元素(何为容器那?就是 列表,元组,集合,字典等)
def func(): print("123456") func_dict = { "func":func } func_dic["func"]()如下例子,Python实现增删改查:
1 #!/usr/bin/env python3 2 # -*- coding:utf-8 -*- 3 4 def sql_analysis(sql): 5 ''' 6 1: 解析 sql 语句的函数,判断 sql 语句是 select, delete, update, insert 中的哪种 7 2: 对 sql 语句进行逐个词语进行切分,切分后形成列表 8 3: 将切分后的字符传给相应的函数进行处理 9 ''' 10 # 字典负责通过筛选对应相应的函数 11 sql_perform_dic = { 12 "select": select_perform, 13 "insert": insert_perform, 14 "delete": delete_perform, 15 # "update": update_perform, 16 } 17 18 # 拆分 sql 使他形成一个列表 19 sql_syncopate = sql.split(" ") 20 21 # 取列表的第一个字符 22 value = sql_syncopate[0] 23 24 # 启动字典筛选出来函数 25 start = "" 26 if value in sql_perform_dic: 27 start = sql_perform_dic[value](sql_syncopate) 28 return start 29 30 def handle_analysis(a, b): 31 # 1: 综合处理函数, 32 # 2: 负责填充select,update 等函数中的字