函数编程
函数3.1 Bytes类型的定义bytes类型是指一堆字节的集合,在python中以b开头的字符串都是bytes类型 b'xe5xb0x8fxe7x8cxbfxe5x9cx88' #b开头的都代表是bytes类型,是以16进制来显示的,2个16进制代表一个字节。 utf-8是3个字节代表一个中文,所以以上正好是9个字节 3.2 Bytes类型的作用计算机只能存储2进制。
在python中,数据转成2进制后不是直接以01010101的形式表示的,而是用一种叫bytes(字节)的类型来表示的。 >>> s = "小猿圈" >>> s.encode("utf-8") # 以utf-8编码 b'xe5xb0x8fxe7x8cxbfxe5x9cx88' #b开头的都代表是bytes类型,是以16进制来显示的,2个16进制代表一个字节。 utf-8是3个字节代表一个中文,所以以上正好是9个字节 在python中,字符串必须编码成bytes后才能存到硬盘上。 在python3中文件存储的默认编码是utf-8. ''' 自行改变文件的默认编码,改成gbk格式的 ''' f = open('book.txt','w','gbk') 以2进制的模式操作文件当然,在打开文件时如果你不想让open这个对象帮你自动编码,你也可以直接往文件里存入bytes数据。 f = open(file="encode_test",mode="wb") # wb以2进制模式打开文件 s = "自学编程,谁不上小猿圈".encode("utf-8") # 自行编码 print(s ) f.write(s) f.close() #以下是print(s)的输出 b'xe8x87xaaxe5xadxa6xe7xbcx96xe7xa8x8bxefxbcx8cxe8xb0x81xe4xb8x8dxe4xb8x8axe5xb0x8fxe7x8cxbfxe5x9cx88' 2进制模式打开文件有
3.3 字符编码的转换编码转换是指将一种编码转成另外一种编码,比如 utf-8 to gbk。 为何需要编码转换呢? 因为不同操作系统编码不同, utf-8在win上没办法直接看,因为windows是GBK编码的,得转成gbk。 反过来如果你的GBK字符相在LinuxMac上正常显示,就得转成utf-8编码。 编码&解码>>> s.encode("utf-8") # 编码 b'xe5xb0x8fxe7x8cxbfxe5x9cx88' >>> s_utf8=s.encode("utf-8") >>> >>> s_utf8.decode("utf-8") #解码 '小猿圈' 在py3里,内存里的字符串是以unicode编码的,unicode的其中一个特性就是跟所有语言编码都有映射关系。所以你的utf-8格式的文件,在windows电脑上若是不能看,就可以把utf-8先解码成unicode,再由unicode编码成gbk就可以了。 注意,不管在Windows or Mac or Linux上,你的pycharm IDE都可以支持各种文件编码,所以即使是utf-8的文件,在windows下的pycharm里也可以正常显示 3.4 深浅copy(杯子问题)
你说d2打印的值里,age是18,还是20? {'name': 'alex','age': 20,'scores': {}} 为何是20呢? 因为d2=data相当于只是拿到了 如果我确实想复制一份完成的dict数据怎么办呢? ==可以用浅copy语法==(python自带,不用导入模块) 因为浅copy会仅复制dict的第一层数据,更深层的scores下面的值依然是共享一份。 注意图中的2个dict中的name都是alex,内存地址也一样,在没改前,两个name都确实指向同一个内存地址,但只要改任何一个的值,内存地址都会变更, 如age这个key一样。 ==深copy==(必须导入python中的一个工具模块)(很少用,因为完全复制一份数据,占空间)
3.5 函数的定义
函数返回值与作用域
3.6 全局与局部变量name = "Alex Li" def change_name(): name = "金角大王,一个有Tesla的高级屌丝" print("after change",name) change_name() print("在外面看看name改了么?",name) 输出 after change 金角大王,一个有Tesla的高级屌丝 在外面看看name改了么? Alex Li 为什么在函数内部改了name的值后, 在外面print的时候却没有改呢? 因为这两个name根本不是一回事
就是想在函数里修改全局变量怎么办?name = "Alex Li" def change_name(): global name #声明一个全局变量 name = "Alex 又名金角大王,爱生活、爱自由、爱姑娘" print("after change",name)
传递列表、字典、集合产生的现象d = {"name":"Alex","age":26,"hobbie":"大保健"} l = ["Rebeeca","Katrina","Rachel"] def change_data(info,girls): info["hobbie"] = "学习" girls.append("XiaoYun") change_data(d,l) print(d,l) 执行结果{‘name’: ‘Alex’,‘age’: 26,‘hobbie’: ‘学习’ } [‘Rebeeca’,‘Katrina’,‘Rachel’,‘XiaoYun’] 不是说不能在函数里改全局变量么,怎么改了呀?
3.7 嵌套&匿名&高阶函数嵌套函数函数里不仅可以写代码,还可以嵌套函数 name = "小猿圈" def change(): name = "小猿圈,自学编程" def change2(): # global name 如果声明了这句,下面的name改的是最外层的全局变层 name = "小猿圈,自学编程不要钱" #这句注释掉的话,下面name打印的是哪个值? print("第3层打印",name) change2() # 调用内层函数 print("第2层打印",name) change() print("最外层打印",name) 输出 第3层打印 小猿圈,自学编程不要钱 第2层打印 小猿圈,自学编程 最外层打印 小猿圈 通过上面的例子,我们理解了,每个函数里的变量是互相独立的,变量的查找顺序也是从当前层依次往上层找。 问个哲学问题,这东西有什么用呢?哈,现在没用,不解释,长大后学了装饰器你就知道有啥用了。 匿名函数匿名函数就是不需要显式的指定函数名 #这段代码 def calc(x,y): return x**y print(calc(2,5)) #换成匿名函数 calc = lambda x,y:x**y print(calc(2,5)) 你也许会说,用上这个东西没感觉有毛方便呀, 。。。。呵呵,如果是这么用,确实没毛线改进,不过匿名函数主要是和其它函数搭配使用的呢,如下 res = map(lambda x:x**2,[1,5,7,4,8]) for i in res: print(i) 输出 1 25 49 16 64
高阶函数变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。 def get_abs(n): if n < 0 : n = int(str(n).strip("-")) return n def add(x,y,f): return f(x) + f(y) res = add(3,-6,get_abs) print(res) 只需满足以下任意一个条件,即是高阶函数
3.8 函数的递归
3.9 名称空间(LEGB)
==不同变量的作用域不同就是由这个变量所在的名称空间决定的==
3.10 闭包
3.11 函数进阶-装饰器(开放--封闭)
3.12 列表生成式
>>>[x * x for x in range(1,11) if x % 2 == 0] 结果为[4,16,36,64,100] 使用两层循环来生成全排列 >>>[m + n for m in 'ABC' for n in 'XYZ'] 结果为['AX','AY','AZ','BX','BY','BZ','CX','CY','CZ'] 把一个list中的所有字符串变成小写 >>>L = ['Hello','World','IBM','Apple'] >>>[s.lower() for s in L] 结果为['hello','world','ibm','apple'] 3.13 生成器
>>>g = (x * x for x in range(10)) >>>for i in g: print(i)
def fib(max): n,a,b = 0,1 while n < max: yield b a,b = b,a + b n += 1 return 'done' 3.14 迭代器
$$ 都可以通过iter()方法转化为Iterator(迭代器)
for x in [1,5]: pass it = iter([1,5]) while True: try: x = next(it) except StopIteration: break
3.15 内置函数Python的len为什么你可以直接用?肯定是解释器启动时就定义好了
文件操作中的不同打开方式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |