一、赋值、浅拷贝与深拷贝

  • 直接赋值:其实就是对象的引用(别名)。

  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

赋值实例:

  1. # 赋值运算 变量指向同一个内存地址
  2. l1 = [1,2,3]
  3. l2 = l1
  4. l3 = l2
  5. l1.append(666)
  6. print(l1,l2,l3)
  7. print(id(l1),id(l2),id(l3))
  8. # 运行结果:
  9. # [1, 2, 3, 666] [1, 2, 3, 666] [1, 2, 3, 666]
  10. # 1543171498568 1543171498568 1543171498568 赋值运算 变量指向同一个内存地址

赋值实例: 赋值运算 变量指向同一个内存地址

浅拷贝实例:

  1. # copy一个新列表(dict),列表在内存中是新的,但是列表里面的元素,完全沿用之前的元素。
  2. l1 = [1, 2,{'alex':23},4,[22,33]]
  3. l2 = l1.copy()
  4. l1[-1].append(44)
  5. l1[2]['taibai'] = 18
  6. l2[-1].append(55)
  7. l2[2]['egon'] = 36
  8. print(id(l1),id(l2)) #1583337071240 1583337553800
  9. print(id(l1[-1]),id(l2[-1])) #1583337071176 1583337071176
  10. print(l1,l2)#[1, 2, {'alex': 23, 'taibai': 18, 'egon': 36}, 4, [22, 33, 44, 55]] [1, 2, {'alex': 23, 'taibai': 18, 'egon': 36}, 4, [22, 33, 44, 55]]
  11.  
  12. l1[0] = 2
  13. l1[-1].append(88)
  14. l2[-1].append(99)
  15. l1.append(666)
  16. l2.append(999)
  17. print(l1,l2)#[2, 2, {'alex': 23, 'taibai': 18, 'egon': 36}, 4, [22, 33, 44, 55, 88, 99], 666] [1, 2, {'alex': 23, 'taibai': 18, 'egon': 36}, 4, [22, 33, 44, 55, 88, 99], 999]
  18. print(id(l1[0]),id(l2[0])) #140721386935360 140721386935328
  19. print(id(l1),id(l2))#1866099286664 1866099769224

实例一

  1. l1 = [1, 2, 3, [22, 33]]
  2. l2 = l1[:] # 切片 是 浅copy
  3. l1[-1].append(666)
  4. print(id(l1),id(l2)) #不是赋值关系 2304312369800 2304312852040
  5. print(l1,l2) #[1, 2, 3, [22, 33, 666]] [1, 2, 3, [22, 33, 666]]

列表切片属于浅拷贝

  1. x = ['lily', '', 'hr',['a']]
  2. y = x
  3. x[0] = 'lucy'
  4. z = list(x) #列表实例化对象也是前拷贝
  5. x[0] = 'lilei'
  6. x[-1].append('b')
  7. z[-1].append('c')
  8. print(x,y,z)#['lilei', '20', 'hr', ['a', 'b', 'c']] ['lilei', '20', 'hr', ['a', 'b', 'c']] ['lucy', '20', 'hr', ['a', 'b', 'c']]
  9. print(id(x),id(y),id(z))#1744470303368 1744470303368 1744502045704

列表实例化对象也是前拷贝

 图片解析赋值、浅拷贝和深拷贝原理

1、b = a: 赋值引用,a 和 b 都指向同一个对象。

2、b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。

3、b = copy.deepcopy(a): 深度拷贝, a 和 b 完全拷贝了父对象及其子对象,两者是完全独立的。

深拷贝实例:深度拷贝需要引入 copy 模块

  1. import copy
  2. # 总结:深copy则会在内存中开辟新空间,将原列表以及列表里面的可变的数据类型重新创建一份,
  3. # 不可变的数据类型则沿用之前的。
  4. l1 = [1, 2, 3, [22, 33]]
  5. l2 = copy.deepcopy(l1)
  6. print(id(l1), id(l2))
  7. print(id(l1[0]),id(l2[0]))
  8. print(id(l1[-1]),id(l2[-1]))
  9. l1[0] = 2
  10. l1[-1].append(666)
  11. print(l1,l2)
  12. # 运行结果:
  13. # 2522273468936 2522273389832
  14. # 140732471497760 140732471497760
  15. # 2522273604680 2522273605000
  16. # [2, 2, 3, [22, 33, 666]] [1, 2, 3, [22, 33]]
  17. #
  18. # 小知识点:
  19. # id 测试对象的内存地址
  20. # == 比较 比较两边的数值是否相等
  21. # print(2 == 2)
  22. # is 判断 判断的两边对象的内存地址是否是同一个

深拷贝实例 内存地址比较 id

二、文件操作

之前对文件进行的任何操作,都必须依赖一个文件编辑器,word wps等等
假设一个场景:现在世界上没有任何个文件编辑器的产生。

设计这个软件必要的三要素:
path:文件的路径。
encoding:文件以什么编码方式存储,就以什么编码方式读取。
mode:读,写,写读,读写,追加,改等等。不写mode默认是r  不同模式打开文件的完全列表:

例子:以下这种读取方法只适合读取小文件

  1. f1 = open(r'C:\Users\Administrator\Desktop\python_excel\log\rsyncd.log', encoding='utf-8', mode='r')
  2. content = f1.read()
  3. print(content)
  4. f1.close()

文件句柄赋值给一个变量 ,例如 上面例子变量f1。open 内置函数 底层调用的操作系统的操作文件功能的接口。windows: 默认编码gbk,linux utf-8,  ios: utf-8。带b的模式操作对象都是非文字类的文件:视频,音频,图片。
操作文件总共3步:1,打开文件,产生文件句柄。2,对文件句柄进行操作。3,关闭文件句柄。

常见错误

1,UnicodeDecodeError: 'gbk' codec can't decode... 编解码错误。
 2,路径错误。路径分隔符 与后面的字符产生特殊的意义。 解决方式 r 或者 \  # 绝对路径:从根目录开始。和   # 相对路径:同一个工作目录(文件夹)下。

三个大方向:

1、读:r(只读) rb(bytes类型只读) r+(读写) rb+(bytes类型读写)  默认就是r模式

# 1.1 read()

  1. f1 = open(r'C:\Users\Administrator\Desktop\python_excel\log\rsyncd.log', encoding='utf-8',)
  2. content = f1.read()
  3. print(content,type(content))
    f1.close()
  4. 结果:
  5. D:\python\python37\python.exe C:/Users/Administrator/Desktop/python_excel/ZY.py
  6. haha
  7. caltta
  8. xixi <class 'str'>
  9.  
  10. Process finished with exit code 0

# 1.2 read(n)   r模式下,n代表字符。

  1. f1 = open(r'C:\Users\Administrator\Desktop\python_excel\log\rsyncd.log', encoding='utf-8',)
  2. content = f1.read(6) #eg: haha\nc 6个字符
  3. print(content)
  4. print('haha\nc')
    f1.close()
  5. D:\python\python37\python.exe C:/Users/Administrator/Desktop/python_excel/ZY.py
  6. haha
  7. c
  8. haha
  9. c
  10.  
  11. Process finished with exit code 0

# 1.3 readline() 按行读取

  1. f1 = open(r'C:\Users\Administrator\Desktop\python_excel\log\rsyncd.log', encoding='utf-8', mode='r')
  2. print(f1.readline().strip())
  3. print(f1.readline().strip())
    f1.close()
  4. D:\python\python37\python.exe C:/Users/Administrator/Desktop/python_excel/ZY.py
  5. haha
  6. caltta
  7.  
  8. Process finished with exit code 0

# 1.4 readlines() 返回一个列表,列表里面的元素是原文件每一行

  1. f1 = open(r'C:\Users\Administrator\Desktop\python_excel\log\rsyncd.log', encoding='utf-8', mode='r')
  2. content = f1.readlines()
  3. print(content)
  4. f1.close()
  5. 结果:
  6. D:\python\python37\python.exe C:/Users/Administrator/Desktop/python_excel/ZY.py
  7. ['haha\n', 'caltta\n', 'xixi']
  8.  
  9. Process finished with exit code 0

# 1.5 for循环

  1. f1 = open(r'C:\Users\Administrator\Desktop\python_excel\log\rsyncd.log', encoding='utf-8', mode='r')
  2. for line in f1:
  3. print(line.strip())
  4. f1.close()
  5. D:\python\python37\python.exe C:/Users/Administrator/Desktop/python_excel/ZY.py
  6. haha
  7. caltta
  8. xixi
  9.  
  10. Process finished with exit code 0

rb模式

  1. #f1 = open(r'log\rsyncd.log', encoding='utf-8', mode='rb') #b的方式不能指定编码
  2. #文件不管以什么编码保存到磁盘上 都是以二进制方式存储,所以在读取rb和写入wb时直接用二进制来操作
  3. #关于换行,Windows以\r\n来换行 Linux以\n来换行
  4.  
  5. f1 = open(r'log\rsyncd.log', mode='rb')
  6. content = f1.read()
  7. print(content)
  8. print(content.decode('utf-8'))
  9. f1.close()
  10. 结果:
  11. D:\python\python37\python.exe C:/Users/Administrator/Desktop/python_excel/ZY.py
  12. b'haha\r\ncaltta\r\nxixi'
  13. haha
  14. caltta
  15. xixi
  16.  
  17. Process finished with exit code 0

r+ 读写模式

先读后写

  1. f = open(r'log\rsyncd.log',encoding='utf-8',mode='r+')
  2. print(f.read()) #先读完 光标会移到文本末尾
  3. '''
  4. haha
  5. caltta
  6. xixi
  7. '''
  8. f.write('') #然后再写 写完后当前光标也在末尾
  9. '''
  10. haha
  11. caltta
  12. xixi666
  13. '''
  14. print(f.read()) #再读就都不用来了
  15. f.close()

先写后读会出问题(会从光标开始替换原来的内容)

  1. # -*-coding:utf8 -*- #要指定代码编码格式 以防止中文报错
  2. f = open(r'log\rsyncd.log',encoding='utf-8',mode='r+')
  3. f.write('秦小芳和徐志文')
  4. print(f.read())#覆盖原来的内容 光标移动到 ‘文’ 字后面
  5. f.close()
  1. 原文件内容:
  2. haha
  3. caltta
  4. xixi
  5. xiaoming
  6.  
  7. 覆盖后的文件内容:
  8. 秦小芳和徐志文iaoming

结果

2、第二写模式 写 w wb w+ wb+
# w模式  没有文件创建文件写入内容,有文件先清空内容后写入。

  1. f = open(r'log\rsyncd.log',encoding='utf-8',mode='w')
  2. f.write('hi')
  3. f.write('caltta ~~~')
  4. f.write('深圳 ~~~')
  5. f.write('北京 ~~~')
  6. f.write('上海 ~~~')
  7. f.write('南京 ~~~')
  8. f.close()
  9. 结果:
  10. hicaltta ~~~深圳 ~~~北京 ~~~上海 ~~~南京 ~~~

小栗子

# wb模式

  1. f1 = open('timg.jpeg', mode='rb')
  2. content = f1.read()
  3. print(content)
  4. f2 = open('timg2.jpeg',mode='wb')
  5. f2.write(content)
  6. f2.close()

小栗子

# w+ 写读

  1. f = open('log1',encoding='utf-8',mode='w+')
  2. f.write('深圳市民中心...')
  3. f.seek(0)
  4. print(f.read())
  5. f.close()

小栗子

3、追加(a ab a+ a+b)模式 a 追加 没有文件创建文件追加内容,有文件,在文件最后追加内容。

  1. f = open('log3',encoding='utf-8',mode='a')
  2. f.write('深圳')
  3. f.close()

文件操作的其他方法
# seek 调整光标位置 按照字节移动 对英文数字字母没问题   对中文会有问题  。 因为除了acsll码都是多个字节一个字符
#seek(0) 将光标移动到开始,  seek(0,2) 将光标移动到最后。  # tell 获取光标位置 ,按照字节。# readable() writable() 是否可以读?可以写?

  1. f = open(r'log\rsyncd.log',encoding='utf-8') #hi caltta ~~~深圳 ~~~北京 ~~~上海 ~~~南京 ~~~
  2. f.seek(10)
  3. print(f.read()) #~~~深圳 ~~~北京 ~~~上海 ~~~南京 ~~~
  4. print(f.tell()) #当前关闭位置 已经到了最后 53
  5. f.seek(0) # 将光标移动到开始
  6. print(f.tell()) #
  7. f.seek(0,2) # 将光标移动到最后。
  8. print(f.tell()) #
  9. print(f.read()) # 打印为空
  10. print(f.writable()) #False
  11. if f.writable():
  12. f.write('')
  13. f.close()

# flush 刷新 保存

  1. f = open('log3',encoding='utf-8',mode='w')
  2. f.write('fjdsklafjdfjksa')
  3. f.flush()
  4. f.close()

小栗子

# truncate 截断截取

  1. f = open(r'log\rsyncd.log',encoding='utf-8',mode='r+')
  2. f.truncate(3) #将文件截断只留下三个字节
  3. f.close()
  1. import os
  2. import time
  3. import shutil
  4.  
  5. root_dir = r'C:\Users\Administrator\Desktop\python_excel\log'
  6. os.chdir(root_dir)
  7. oldname = 'rsyncd.log'
  8. newname = time.strftime('%Y-%m-%d', time.localtime()) + oldname
  9.  
  10. if os.path.exists(oldname): #每天创建新的rsyncd.log的日志文件,
  11. if os.path.exists(newname):
  12. pass
  13. else:
  14. shutil.copy(oldname,newname)
  15. with open(oldname, 'r+') as f:
  16. f.seek(0)
  17. f.truncate()
  18.  
  19. else:
  20. f = open(oldname, 'w',encoding='gbk')
  21. f.close()
  22.  
  23. dirname= os.listdir(root_dir)
  24. # print(dirname)
  25. ntime = int(time.time()) - 3600 * 24 * 15 #保留15天以内的日志文件
  26. for item in dirname:
  27. if item == oldname:
  28. pass
  29. else:
  30. ft = os.stat(item)
  31. ltime = int(ft.st_mtime)
  32. # print('ft:',ft)
  33. # print('ltime:',ltime,item)
  34. if ltime <= ntime:
  35. os.remove(item)
  36. else:
  37. pass

只保留15天的日志

文件的改
1,以读的模式打开原文件。
2,以写的模式打开新文件。
3,读取原文件对源文件内容进行修改形成新内容写入新文件。
4,将原文件删除。
5,将新文件重命名成原文件。

  1. # 方法一 小文件可以。
  2. import os
  3.  
  4. # 1,以读的模式打开原文件。
  5. # 2,以写的模式打开新文件。
  6. with open('xxx个人简历',encoding='gbk') as f1,\
  7. open('xxx个人简历.bak',encoding='utf-8',mode='w') as f2: #f1的文件编码格式是什么就用什么格式
  8. # 3,读取原文件对源文件内容进行修改形成新内容写入新文件。
  9. old_content = f1.read()
  10. # print(old_content)
  11. new_content = old_content.replace('xxx','hi')
  12. f2.write(new_content)
  13.  
  14. # 4,将原文件删除。
  15. os.remove('xxx个人简历')
  16. # 5,将新文件重命名成原文件。
  17. os.rename('xxx个人简历.bak','xxx个人简历')
  18.  
  19. # 方法二:
  20. import os
  21.  
  22. # 1,以读的模式打开原文件。
  23. # 2,以写的模式打开新文件。
  24. with open('xxx个人简历',encoding='utf-8') as f1,\
  25. open('xxx个人简历.bak',encoding='utf-8',mode='w') as f2:
  26. # 3,读取原文件对源文件内容进行修改形成新内容写入新文件。
  27. for old_line in f1:
  28. new_line = old_line.replace('hi','xiaohei')
  29. f2.write(new_line)
  30.  
  31. # 4,将原文件删除。
  32. os.remove('xxx个人简历')
  33. # 5,将新文件重命名成原文件。
  34. os.rename('xxx个人简历.bak','xxx个人简历')

大栗子一 文件修改

  1. # -*-coding:utf8 -*-
  2.  
  3. '''
  4. 修改svn配置文件
  5. 将svn配置文件中的 工号 替换为 姓名+工号 eg: xiaoming xiaoming00001008
  6. 提供了一个名单文件格式:
  7. xiaoyang00001007
  8. xiaoming00001008
  9. ...
  10. '''
  11. import os
  12.  
  13. dic = {}
  14. with open(file='svnuser.txt',encoding='gbk',mode='r') as f: #Windows文件默认是gbk 编码的
  15. for line in f:
  16. # print(line.strip())
  17. tempstr = line.strip()[-10:]
  18. dic[tempstr] = line.strip()
  19. # print(tempstr,type(tempstr))
  20. with open('gota_4g.conf',encoding='utf-8') as f1,\
  21. open('gota_4g.conf.bak',encoding='utf-8',mode='w') as f2:
  22. for old_line in f1:
  23. for key in dic.keys():
  24. old_line = old_line.replace(key,dic[key])
  25.  
  26. f2.write(old_line)
  27. # 将原文件删除。
  28. os.remove('gota_4g.conf')
  29. # 将新文件重命名成原文件。
  30. os.rename('gota_4g.conf.bak','gota_4g.conf')

大栗子二 文件修改

三、函数的初识

函数基础:什么是函数、函数的结构、函数的返回值、函数的参数
函数进阶:1. 名称空间、作用域、加载顺序、取值顺序   2. 内置函数 locals() globals()  3. 函数名  4. 高阶函数(函数的嵌套)  4. nonlocal global

1、函数(结构、作用、返回值)
  1. # 面向过程编程
  2. # 但是有缺点:
  3. # ,代码重复太多。
  4. # ,代码的可读性差。---> 诞生函数式编程
  5. s1 = 'fjksdfjsdklf'
  6. count =
  7. for i in s1:
  8. count +=
  9. print(count)
  10.  
  11. l1 = [, , , , ]
  12. count =
  13. for i in l1:
  14. count +=
  15. print(count)
  1. # 函数是什么?
  2. # 功能体,一个函数封装的一个功能,
  3. # 结构:
  4. '''
  5. def 函数名():
  6. 函数体
  7. '''
  8. # 面向函数式编程:函数什么时候执行?调用:函数名()
  9. def my_lf_len(s):
  10. count =
  11. for i in s:
  12. count +=
  13. print(count)
  14.  
  15. my_lf_len('fdskfjskdlf')
  1. # 函数的返回值
  2. def Tantan():
  3. print('左滑动一下')
  4. print('右滑动一下')
  5. # return
  6. print('发现美女,打招呼')
  7. # return '美女一枚'
  8. # return ['恐龙一堆','肯德基']
  9. return '小萝莉', '肯德基', '御姐'
  10.  
  11. # 调用一次执行一次
  12. Tantan()
  13.  
  14. '''
  15. return:
  16. ,终止函数。
  17. ,给函数的调用者(执行者)返回值。
  18. return ---> 函数名() None
  19. return 单个值 ---> 函数名() 直接返回该值 ['恐龙一堆','肯德基']
  20. return 多个值 ---> 函数名() 返回多个值组成的元组 ('小萝莉', '肯德基', '御姐')
  21. '''
  22. ret = Tantan()
  23. print('值:',ret, '\t类型:',type(ret))
2、函数(参数)
  1. # 练习:
  2. # # n = if 你看到卖西瓜 :n =
  3. def max_(a,b): return a if a > b else b
  4. # # if a > b:
  5. # # return a
  6. # # else:
  7. # # return b
  8. # # return a if a > b else b
  9. print(max_(,))
  10. # 三元运算符
  11. # a = '饼'
  12. # b = '西瓜'
  13. # ret = a if > else b
  14. # print(ret)

三元运算符

  1. def Tantan(sex): #函数的定义:sex形式参数,形参
  2. print('左滑动一下')
  3. print('右滑动一下')
  4. print('发现美女,打招呼')
  5. return '小萝莉', '肯德基', '御姐'
  6. Tantan('女') # 函数的执行:'女' 实际的数据, 实参。
  7.  
  8. #.位置参数。 从左至右,一一对应
  9. def Tantan(sex,age):
  10. print('筛选性别%s,年龄%s左右' %(sex,age))
  11. print('左滑动一下')
  12. print('右滑动一下')
  13. print('发现美女,打招呼')
  14. Tantan('女',,)
  15.  
  16. # 关键字参数。 一一对应。 函数参数较多 记形参顺序较麻烦时,需要关键字参数。
  17. def Tantan(sex,age,area):
  18. print('筛选性别%s,%s 附近,年龄%s左右的美女' %(sex,area,age))
  19. print('左滑动一下')
  20. print('右滑动一下')
  21. print('发现美女,打招呼')
  22. Tantan(sex='女',area='南山区',age='')
  23.  
  24. #. 混合参数 : 一一对应,关键字参数必须要在位置参数后面。
  25. def Tantan(sex,age,area):
  26. print('筛选性别%s,%s 附近,年龄%s左右的美女' %(sex,area,age))
  27. print('搜索')
  28. print('左滑动一下')
  29. print('右滑动一下')
  30. print('发现美女,打招呼')
  31. Tantan('女',,area='南山区')
  32.  
  33. #. 默认参数 : 使用最多的一般不更改的参数,默认参数一定放在位置参数后面
  34. def Tantan(area,age,sex='girl'):
  35. print('筛选性别%s, %s 附近,年龄%s左右的美女' %(sex,area,age))
  36. print('左滑动一下')
  37. print('右滑动一下')
  38. print('发现美女,打招呼')
  39. Tantan('南山区',,'laddboy')
  1. #. 万能参数 *args, **kwargs
  2. def Tantan(*args,**kwargs):
  3. # 函数的定义: * 代表聚合。
  4. # * 将实参角度所有的位置参数放到一个元祖中,并将元组给了args
  5. # ** 将实参角度所有的关键字参数放到一个字典中中,并将字典给了kwargs
  6. print(args) # ('南山区', '')
  7. print(kwargs) #{'body': '身材好', 'voice': '萝莉音', 'money': '白富美'}
  8. print('筛选地域:%s,年龄%s' % args) #筛选地域:南山区,年龄28
  9. print('左滑动一下')
  10. print('右滑动一下')
  11. print('发现美女,打招呼')
  12. Tantan('南山区','',body='身材好',voice='萝莉音',money='白富美')
  13.  
  14. # 形参的最终顺序
  15. # 位置参数 -- *args -- 默认参数 -- **kwargs
  16. def func(a,b,*args,sex='女',):
  17. print(a,b,sex,args)
  18. func(,,,,,sex='男') # 男 (, , )
  19. def func(a,b,*args,sex='女',**kwargs):
  20. print(a,b,sex,args,kwargs)
  21. func(,,,,,name='alex',age=) # 女 (, , ) {'name': 'alex', 'age': }
  1. def Tantan(*args,**kwargs):
  2. print(args)
  3. print(kwargs)
  4.  
  5. l1 = [,,]
  6. l2 = (,,)
  7. Tantan(*l1,*l2) # 函数的执行:*iterable 打散 **dic 将所有的键值对添加到kwargs。
  8. #(, , , , , )
  9. #{}
  10. Tantan(, , , , , )
  11. # (, , , , , )
  12. # {}
  13. dic1 = {'name':"alex"}
  14. dic2 = {'age':}
  15. Tantan(**dic1,**dic2)
  16. # ()
  17. # {'name': 'alex', 'age': }

*iterable 打散 **dic 将所有的键值对添加到kwargs。

3、函数进阶

python的空间三种:全局名称空间、局部名称空间、内置名称空间

python中的作用域:
1. 全局作用域:内置名称空间 全局名称空间
2. 局部作用域:局部名称空间

取值顺序: 就近原则 (局部名称空间 ——————> 全局名称空间 ——————> 内置名称空间)
加载顺序:内置名称空间 -------> 全局名称空间 -------> 局部名称空间

  1. ###例子1
  2. input = 'barry'
  3. def func():
  4. input = 'alex' #局部变量 只在函数体 局部名称空间有效
  5. print(input)
  6. func() #alex
  7. print(input) #barry
  8.  
  9. ###例子2
  10. def func1():
  11. print(111)
  12.  
  13. def func2(): #函数加载时 只加载函数名 不执行函数
  14. print(222)
  15. func1()
  16.  
  17. def func3(): #函数加载时 只加载函数名 不执行函数
  18. print(333)
  19. func2()
  20.  
  21. print(444)
  22. func1()
  23. print(555)
  24. # 结果:444 111 555
  25.  
  26. ###例子3
  27. def func1():
  28. print(111)
  29.  
  30. def func2():
  31. print(222)
  32. func1()
  33.  
  34. def func3():
  35. print(333)
  36. func2()
  37.  
  38. print(444)
  39. func3()
  40. print(555)
  41. # 结果:444 333 222 111 555
  42.  
  43. ###例子4
  44. def wraaper():
  45. print(222)
  46. def inner():
  47. print(111)
  48. print(444)
  49. inner()
  50. print(333)
  51. wraaper()
  52. # 结果:222 444 111 333

示例

 

 内置函数 locals() globals()

  1. name = 'alex'
  2. age = 46
  3. def func():
  4. sex = '男'
  5. hobby = '女'
  6. print(globals()) # 返回一个字典:全局作用域的所有内容
  7.  
  8. print(locals()) # 当前位置的内容
  9. func()
  10. print(globals()) # 返回一个字典:全局作用域的所有内容
  11. print(locals()) # 当前位置的内容
  1. {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001E308500DD8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/Desktop/CMDB/95/autoclient/test.py', '__cached__': None, 'name': 'alex', 'age': 46, 'func': <function func at 0x000001E3084BC1E0>}
  2.  
  3. {'sex': '男', 'hobby': '女'}
  4.  
  5. {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001E308500DD8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/Desktop/CMDB/95/autoclient/test.py', '__cached__': None, 'name': 'alex', 'age': 46, 'func': <function func at 0x000001E3084BC1E0>}
  6.  
  7. {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001E308500DD8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/Desktop/CMDB/95/autoclient/test.py', '__cached__': None, 'name': 'alex', 'age': 46, 'func': <function func at 0x000001E3084BC1E0>}

结果

 

函数名的运用

  1. def func():
  2. print(666)

1. 函数名是一个特殊的变量 函数名() 执行此函数 # func()

 2. 函数名可以当做变量进行赋值运算。

  1. def func():
  2. print(666)
  3. age1 = 12
  4. age2 = age1
  5. age3 = age2
  6. print(age3)
  7. f = func
  8. f()
  9. # 下面不能执行
  10. # age1 = 33
  11. # age1()
  12. print(globals())
  13.  
  14. 666
  15. 12
  16. 666
  17.  
  18. {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000224BA380DD8>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/Desktop/CMDB/95/autoclient/test.py', '__cached__': None, 'func': <function func at 0x00000224BA672378>, 'age1': 12, 'age2': 12, 'age3': 12, 'f': <function func at 0x00000224BA672378>}
  19. 其中:func': <function func at 0x00000224BA672378> == 'f': <function func at 0x00000224BA672378>
  20. 'age1': 12, 'age2': 12, 'age3': 12,

3. 函数名可以作为容器型数据的元素。

  1. def func():
  2. print(666)
  3. def func1():
  4. print(777)
  5. def func2():
  6. print(888)
  7. def func3():
  8. print(999)
  9. # a = 1
  10. # b = 2
  11. # c = 3
  12. # d = 4
  13. # l1 = [a, b, c, d]
  14. l1 = [func, func1, func2, func3]
  15. # for i in l1:
  16. # i()
  17. dic = {
  18. 1: func,
  19. 2: func1,
  20. 3: func2,
  21. 4: func3,
  22. }
  23. dic[1]()
  24. dic[2]()
  25. dic[3]()
  26. # while 1:
  27. # num = input('请输入序号:').strip()
  28. # if num == '1':
  29. # func()
  30. # elif num == '2':
  31. while 1:
  32. num = input('请输入序号:').strip()
  33. num = int(num)
  34. dic[num]()

4.函数名可以作为函数的参数。

  1. def func1():
  2. print(111)
  3. def func2(x):
  4. x()
  5. print(222)

5. 函数名可以作为函数的返回值。

  1. def func1():
  2. print(111)
  3. def func2(x):
  4. print(222)
  5. return x
  6. ret = func2(func1)
  7. ret()
  1. def func():
  2. print(1111)
  3. func()
  4. f = func
  5. func = 1
  6. print(func)
  7. print(f)
  8. age1 = 12
  9. age2 = age1
  10. age3 = age2
  11. age2 = 46
  12. print(age1,age2,age3) # 12 46 12
  13. age1 = [1,2,3]
  14. age2 = age1
  15. age1.append(666)
  16. print(age1,age2)
  17.  
  18. D:\python\python37\python.exe C:/Users/Administrator/Desktop/CMDB/95/autoclient/test.py
  19. 1111
  20. 1
  21. <function func at 0x000001F1E63DC1E0>
  22. 12 46 12
  23. [1, 2, 3, 666] [1, 2, 3, 666]
  24.  
  25. Process finished with exit code 0

函数名作为变量问题

  

# global nonlocal
# global
#1,声明一个全局变量。

  1. # def f():
  2. # print(name)
  3. # def func():
  4. # global name
  5. # name = 'alex'
  6. # func()
  7. # f()
  8. # print(name)
  9. # print(globals())

  

# 2,修改一个全局变量。
# 原因:局部作用域只能引用全局变量而不能改变全局变量。

  1. count = 1
  2. def func1():
  3. global count
  4. count += 1
  5. print(count)
  6. func1()
  7. print(count)

# nonlocal: 子级函数可以通过nonlocal修改父级(更高级非全局变量)函数的变量。
# 现象:子级函数可以引用父级函数的变量但是不能修改。

  1. def func():
  2. count = 1
  3. def func1():
  4. def inner():
  5. nonlocal count
  6. count += 1
  7. print(count) # 2
  8. print(count) # 1
  9. inner()
  10. print(count) # 2
  11. func1()
  12. func()

  

  1. count = 1
  2. def func1():
  3. def inner():
  4. nonlocal count
  5. count += 1
  6. print(count)
  7. inner()
  8.  
  9. func1()

  

day03深浅拷贝、文件操作和函数初识的更多相关文章

  1. python笔记2小数据池,深浅copy,文件操作及函数初级

    小数据池就是在内存中已经开辟了一些特定的数据,经一些变量名直接指向这个内存,多个变量间公用一个内存的数据. int: -5 ~ 256 范围之内 str: 满足一定得规则的字符串. 小数据池: 1,节 ...

  2. python学习day7 深浅拷贝&文件操作

    4-4 day07 深浅拷贝&文件操作 .get()用法 返回指定键的值,如果值不在字典中返回默认值. info={'k1':'v1,'K2':'v2'}mes = info.get('k1' ...

  3. php中文件操作常用函数有哪些

    php中文件操作常用函数有哪些 一.总结 一句话总结:读写文件函数 判断文件或者目录是否存在函数 创建目录函数 file_exists() mkdir() file_get_content() fil ...

  4. python 文件操作: 文件操作的函数, 模式及常用操作.

    1.文件操作的函数: open("文件名(路径)", mode = '模式', encoding = "字符集") 2.模式: r , w , a , r+ , ...

  5. python 文件操作的函数

    1. 文件操作的函数 open(文件名(路径), mode="?", encoding="字符集") 2. 模式: r, w, a, r+, w+, a+, r ...

  6. PHP文件操作功能函数大全

    PHP文件操作功能函数大全 <?php /* 转换字节大小 */ function transByte($size){ $arr=array("B","KB&quo ...

  7. python基础知识-7-内存、深浅、文件操作

    python其他知识目录 1.一些对内存深入理解的案例 以下列举列表,列表/字典/集合这些可变类型都是一样的原理 变量是个地址,指向存储数据的内存空间的地址,它的实质就相当于c语言里的指针.变量和数据 ...

  8. Python基础-week03 集合 , 文件操作 和 函数详解

    一.集合及其运算 1.集合的概念 集合是一个无序的,不重复的数据组合,它的主要作用如下 *去重,把一个列表变成集合,就自动去重了 *关系测试,测试两组数据之前的交集.并集.差集.子集.父级.对称差集, ...

  9. Python全栈开发之3、深浅拷贝、变量和函数、递归、函数式编程、内置函数

    一.深浅拷贝 1.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy # 定义变量 数字.字符串 # n1 = 123 n1 ...

随机推荐

  1. 从零开始创建一个 PHP 扩展

    创建一个扩展的基本步骤都有哪些.示例中,我们将实现如下功能: <?phpecho say();?> 输出内容: $ php ./test.php$ hello word 在扩展中实现一个s ...

  2. 1. 构建第一个SpringBoot工程

    1.File -  New - Module 2.选项的是Spring Initializr(官方的构建插件,需要联网) ,一定要选择jdk 3.填写项目基本信息 Group:组织ID,一般分为多个段 ...

  3. mysql如何删除数据库指定ID段的数据库。比如删除id 1-500的数据。

    delete from tablename where id>=1 and id<=500或者DELETE FROM `数据库名称`.`数据表名称` WHERE `house_cs`.`i ...

  4. java 反射之获取泛型对象的所有字段与对应的值(包括父类的)

    上代码: public static void main(String[] args) throws IntrospectionException { SysUser obj = new SysUse ...

  5. (17)Spring Boot普通类调用bean【从零开始学Spring Boot】

    我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...

  6. [下载]Oracle LOB字段编辑工具

    OraLobEditor 是Oracle LOB (CLOB, BLOB) 字段编辑工具. 查看.编辑LOB (CLOB, BLOB)字段(plain text, RTF, image, hex, h ...

  7. mongodb--find高级用法

    链式查询 db.person.find().limit(4).sort({sex:-1}) // sort来说,1 是升序, -1 是降序 尽量不要用mongodb去做一些复杂的运算 分页的写法 ·· ...

  8. UVA The Tower of Babylon

    The Tower of Babylon Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many det ...

  9. HDU 1242

    简单题 #include <iostream> #include <cstdio> #include <queue> using namespace std; ; ...

  10. poj 3267 The Cow Lexicon (动态规划)

    The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8167   Accepted: 3845 D ...