## 深浅拷贝

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 赋值运算
  4. # 可变的数据类型:由于数据类型可变,修改数据会在原来的数据的基础上进行修改,
  5. # 可变的数据类型有:列表,字典
  6. l1 = [1, 2, 3]
  7. l2 = l1
  8. l3 = l2
  9. # l1 = [1, 2, 3, 4] # 注意这不是修改数据,而是在内存中重新创建了一份数据,然后L1 指向了这份新数据
  10. l1.append(666) # 在原来的数据上修改
  11. print(l1, l2, l3) # [1, 2, 3, 666] [1, 2, 3, 666] [1, 2, 3, 666]
  12. print(id(l1), id(l2), id(l3)) # 140349669255176 140349669255176 140349669255176
  13. print("--" * 30)
  14. # 不可变的数据类型:由于数据类型是不可变的,不可修改,会在内存中在重新创建一份新的数据
  15. # 不可变的数据类型有:字符串,数字,bool值,元组等
  16. l4 = 'abcd'
  17. l5 = l4
  18. l4 = [1, 2, 3]
  19. print(l4, l5) # [1, 2, 3] abcd
  20. print(id(l4), id(l5)) # 140230928510856 140230926894952
  21. print("--" * 30)
  22. # 浅copy
  23. # copy一个新列表(dict),列表在内存中是新的,但是列表里面的元素,完全沿用之前的元素。
  24. l5 = [1, 2, 3, [22, 33]]
  25. l6 = l5.copy()
  26. print(id(l5), id(l6)) # 140589566668360 140589566718024
  27. l5.append(666)
  28. l5.remove(1)
  29. print(l5, l6) # [2, 3, [22, 33], 666] [1, 2, 3, [22, 33]]
  30. print("--" * 30)
  31. # 列表在内存中是新的,但是列表里面的元素,完全沿用之前的元素
  32. l5 = [1, 2, 3, [22, 33]]
  33. l6 = l5.copy()
  34. print(id(l5[0])) # 4459755568
  35. print(id(l6[0])) # 4459755568
  36. l5[-1].append(666)
  37. print(l5, l6) # [2, 3, [22, 33, 666], 666] [1, 2, 3, [22, 33, 666]]
  38. print("--" * 30)
  39. # 深copy
  40. # 总结 深copy则会在内存中开辟新空间,将原列表以及列表里面的可变的数据类型重新创建一份,
  41. # 不可变的数据类型则沿用之前的,指向之前的数据
  42. import copy
  43. l7 = [1, 2, 3, [22, 33]]
  44. l8 = copy.deepcopy(l7)
  45. print(id(l7), id(l8)) # 140686186753032 140686186752968
  46. l7[-1].append(666)
  47. l7.remove(1) # 只是删除了l1列表中和内存中的数据1的指向关系,并不是在内存中删除了数据1
  48. print(l7, l8) # [2, 3, [22, 33, 666]] [1, 2, 3, [22, 33]]
  49. print("--" * 30)
  50. # id 对象的内存地址
  51. # == 比较两边的数值是否相等
  52. # is 判断的两边对象的内存地址是否是同一个
  53. print(2 == 2)
  54. print("--" * 30)
  55. # 切片是浅copy ******
  56. l1 = [1, 2, 3, [22, 33]]
  57. l2 = l1[:] # 切片是浅copy
  58. l1[-1].append(666)
  59. print(id(l1), id(l2)) # 40282048785864 140282048785608
  60. print(l1, l2) # [1, 2, 3, [22, 33, 666]] [1, 2, 3, [22, 33, 666]]

文件操作

文件操作介绍

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. """
  4. 文件三参数
  5. path:文件的路径
  6. encoding:文件以什么编码方式存储,就以什么编码方式读取
  7. mode:读,写,读写,写读,追加,改等等
  8. 三个大方向:
  9. 带b的模式操作对象都是非文字类的文件:视频,音频,图片。
  10. 读(r rb r+ rb+)
  11. r 读模式
  12. rb
  13. r+ 读写模式
  14. rb+
  15. 写 w wb w+ w+b :如果原文件存在,则清空原文件,在写入。这个慎用
  16. w 写模式
  17. wb
  18. w+ 写读模式
  19. wb+
  20. 追加(a ab a+ a+b)
  21. a 追加
  22. ab
  23. a+
  24. ab+
  25. 文件操作的其他方法:
  26. f.read()
  27. f.write()
  28. f.readline()
  29. f.readlines()
  30. f.close()
  31. f.seek()
  32. f.tell()
  33. """
  34. f1 = open("test.txt",encoding='utf-8',mode='r')
  35. content = f1.read()
  36. print(content)
  37. f1.close()
  38. """
  39. f1变量,文件句柄。
  40. open 内置函数,底层调用的操作系统的操作文件功能的接口。
  41. windows: gbk,linux:utf-8 ios: utf-8
  42. 操作文件总共3步;
  43. 1,打开文件,产生文件句柄。
  44. 2,对文件句柄进行操作。
  45. 3,关闭文件句柄。
  46. """
  47. """
  48. # 错误示范:
  49. # 1,UnicodeDecodeError: 'gbk' codec can't decode... 编解码错误。
  50. # 2,路径错误。路径分隔符 与后面的字符产生特殊的意义。 解决方式 r 或者 \
  51. #f1 = open(r"d:\test\r文件读写test.txt",encoding='utf-8',mode='r')
  52. """

文件操作-读模式

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 读模式(r rb r+ rb+)
  4. # r模式
  5. # 默认就是r模式
  6. # 1.1 read() # 全部读取文件内容,如果文件过大,可能会导致内存不足
  7. f1 = open('test.txt', encoding='utf-8', mode='r')
  8. content = f1.read()
  9. print(content, type(content)) # <class 'str'> 对文件进行读取出来的都是字符串类型
  10. print("=" * 30)
  11. # 1.2 read(n)
  12. # r模式下, n代表字符。
  13. f1 = open('test.txt', encoding='utf-8', mode='r')
  14. content = f1.read(3)
  15. print(content)
  16. print("=" * 30)
  17. # 1.3 readline() 按行读取
  18. f1 = open('test.txt', encoding='utf-8', mode='r')
  19. print(f1.readline().strip())
  20. print(f1.readline().strip())
  21. print(f1.readline().strip())
  22. f1.close()
  23. print("=" * 30)
  24. # 1.4 readlines() 返回一个列表,列表里面的元素是原文件每一行
  25. f1 = open('test.txt', encoding='utf-8', mode='r')
  26. content = f1.readlines()
  27. print(content)
  28. f1.close()
  29. print("=" * 30)
  30. # 1.5 for循环 *****注意平常读取大文件就需要用这种方法
  31. f1 = open('test.txt', encoding='utf-8', mode='r')
  32. for line in f1:
  33. print(line.strip())
  34. f1.close()
  35. print("=" * 30)
  36. # rb模式 读取一些非文字类的文件,如图片,视频等
  37. # 5种读的模式, read() read(n) readline() readlines() for循环读取
  38. # 如果是 rb 模式,就不需要规定编码了 encoding不是编码或解码,它是规定你这个文件到底采用哪种编码模式而已
  39. f1 = open('test.txt', mode='rb')
  40. content = f1.read()
  41. print(content)
  42. print(content.decode('utf-8')) # 解码 utf-8 ---> unicode
  43. f1.close()
  44. print("---rb---")
  45. print("=" * 30)
  46. # rb 模式读取图片
  47. f1 = open('time1.jpg', mode='rb')
  48. content = f1.read()
  49. print(content)
  50. f1.close()
  51. print("=" * 30)
  52. # r+ 读写模式
  53. f = open('log1', encoding='utf-8', mode='r+')
  54. print(f.read())
  55. f.write('666\n')
  56. f.close()
  57. print("=" * 30)
  58. # 先写后读会出问题 会覆盖
  59. f = open('log1', encoding='utf-8', mode='r+')
  60. f.write('松岛岛')
  61. print(f.read())
  62. f.close()
  63. print("=" * 30)
  64. # rb+ 模式

文件操作-写模式

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # w 写模式
  4. # 没有文件,创建文件写入内容
  5. # 有文件,先清空内容后写入
  6. f = open('log1', encoding='utf-8', mode='w')
  7. f.write('123456')
  8. f.write('深圳 ~~~')
  9. f.write('深圳 ~~~')
  10. f.write('深圳 ~~~')
  11. f.write('深圳 ~~~')
  12. f.write('深圳 ~~~')
  13. f.close()
  14. # wb 写模式(以bytes类型写入到文件)
  15. # 把bytes类型写入到文件 --图片
  16. f1 = open('time1.jpg', mode='rb')
  17. content = f1.read()
  18. f1.close()
  19. f2 = open('time2.jpg', mode='wb')
  20. f2.write(content)
  21. f2.close()
  22. # w+ 写读模式
  23. f = open('log1', encoding='utf-8', mode='w+')
  24. f.write('老男孩教育...')
  25. f.seek(0) # 调整光标(指针)到最开始
  26. print(f.read())
  27. f.close()
  28. # wb+ 写读模式(bytes)

文件操作-追加模式

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # a 追加
  4. # 没有文件创建文件追加内容,有文件,在文件最后追加内容。
  5. f = open('log3', encoding='utf-8', mode='a')
  6. f.write('老男孩')
  7. f.close()
  8. # 有文件,在文件最后追加内容。
  9. f = open('log1', encoding='utf-8', mode='a')
  10. f.write('666')
  11. f.close()

文件操作-修改

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 文件的修改:所有的文件编辑器都要经过下面这5步才能对文件进行修改
  4. # 1,以读的模式打开原文件
  5. # 2,以写的模式打开新文件
  6. # 3,读取原文件对源文件内容进行修改形成新内容写入新文件
  7. # 4,将原文件删除
  8. # 5,将新文件重命名成原文件
  9. # # 方法一 小文件可以
  10. # # 1,以读的模式打开原文件
  11. # # 2,以写的模式打开新文件
  12. # import os
  13. # with open('tom个人简历', encoding='utf-8') as f1, open('tom个人简历.bak', encoding='utf-8', mode='w') as f2:
  14. # # 3,读取原文件对源文件内容进行修改形成新内容写入新文件
  15. # old_content = f1.read()
  16. # new_content = old_content.replace('tom', 'SB')
  17. # f2.write(new_content)
  18. # # 4,将原文件删除。
  19. # os.remove('tom个人简历')
  20. # # 5,将新文件重命名成原文件。
  21. # os.rename('tom个人简历.bak', 'tom个人简历')
  22. # 方法二: 推荐使用这种方法
  23. # 1,以读的模式打开原文件。
  24. # 2,以写的模式打开新文件。
  25. import os
  26. with open('tom个人简历', encoding='utf-8') as f1, open('tom个人简历.bak', encoding='utf-8', mode='w') as f2:
  27. # 3,读取原文件对源文件内容进行修改形成新内容写入新文件。
  28. for old_line in f1:
  29. new_line = old_line.replace('SB', 'tom')
  30. f2.write(new_line)
  31. # 4,将原文件删除。
  32. os.remove('tom个人简历')
  33. # 5,将新文件重命名成原文件。
  34. os.rename('tom个人简历.bak', 'tom个人简历')

文件操作-其他常用方法

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 其他操作方法:
  4. # readable() writable() *** 文件句柄是否可读,可写
  5. # seek 调整光标位置 按照字节 ***
  6. # seek(0) 将光标移动到开始
  7. # seek(0,2) 将光标移动到最后。
  8. # tell 获取光标位置 按照字节。 ***
  9. # flush 刷新 保存 ***
  10. # truncate 截取原文件,从头开始截,
  11. f = open('log3', encoding='utf-8')
  12. f.seek(1)
  13. print(f.read())
  14. print(f.tell())
  15. f.seek(0) # 将光标移动到开始
  16. print(f.read())
  17. f.seek(0, 2) # 将光标移动到最后
  18. print(f.read())
  19. f.close()
  20. print("---" * 30)
  21. # writable() 是否可写
  22. f = open('log3', encoding='utf-8')
  23. print(f.read())
  24. print(f.writable()) # False 是否可写
  25. if f.writable():
  26. f.write('111')
  27. f.close()
  28. print("---" * 30)
  29. # flush()
  30. f = open('log3', encoding='utf-8', mode='w')
  31. f.write('fjdsklafjdfjksaadfadf')
  32. f.flush()
  33. f.close()
  34. # 截取原文件,从头开始截,需要在可写的模式下,并且不清空原文件
  35. f = open('log3', encoding='utf-8', mode='r+')
  36. f.truncate(3)
  37. f.close()

函数

函数的初识

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. """
  4. # 面向过程编程
  5. s1 = 'hello jerry'
  6. count = 0
  7. for i in s1:
  8. count += 1
  9. print(count)
  10. l1 = [1, 2, 3, 4, 5]
  11. count = 0
  12. for i in l1:
  13. count += 1
  14. print(count)
  15. # 缺点:
  16. # 1,代码重复太多。
  17. # 2,代码的可读性差。
  18. """
  19. # 函数的初识
  20. def my_lf_len(s):
  21. sun = 0
  22. for _ in s:
  23. sun += 1
  24. print(sun)
  25. s1 = 'hello word'
  26. my_lf_len(s1)
  27. l1 = [1, 2, 3, 3, 5, 56, 6, 6]
  28. my_lf_len(l1)
  29. # 1,函数是什么?
  30. # 功能体,一个函数封装的一个功能
  31. # 结构:
  32. '''
  33. def 函数名():
  34. 函数体
  35. '''
  36. # 2,函数什么时候执行
  37. # 被调用的时候执行 函数名+()
  38. def my_lf_len(s):
  39. sum = 0
  40. for _ in s:
  41. sum += 1
  42. print(sum)
  43. my_lf_len('how are you?')
  44. # 3,函数的返回值 return
  45. def tantan():
  46. print('搜索')
  47. print('左滑动一下')
  48. print('右滑动一下')
  49. # return
  50. print('发现美女,打招呼')
  51. # return '美女一枚'
  52. # return ['恐龙一堆']
  53. # return '小萝莉', '肯德基', '御姐'
  54. return {'name': 'alnk', 'age': 18}, [1, 2, 3, 4, 5] # 这算多个值
  55. ret = tantan()
  56. print(ret, type(ret))
  57. # 调用一次执行一次
  58. tantan()
  59. tantan()
  60. tantan()
  61. # 返回值
  62. '''
  63. return:
  64. 1,终止函数
  65. 2,给函数的调用者(执行者)返回值
  66. return ---> None
  67. return 单个值 ---> 单个值 --被返回的数据是什么数据类型就是什么类型
  68. return 多个值 ---> (多个值,) --元组
  69. '''

函数的参数

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 实参和形参
  4. def Tantan(sex): # 函数的定义:sex形式参数,形参
  5. print('搜索')
  6. print('左滑动一下')
  7. print('右滑动一下')
  8. print('发现美女,打招呼')
  9. return '小萝莉', '肯德基', '御姐'
  10. # 函数的参数
  11. Tantan('女') # 函数的执行:'女' 实际的数据, 实参
  12. # 从两方面讲函数的参数:实参 和 形参
  13. # 一 实参角度
  14. # 1.位置参数 从左至右,一一对应
  15. def Tantan(sex, age):
  16. print('筛选性别%s,年龄%s左右' % (sex, age))
  17. print('搜索')
  18. print('左滑动一下')
  19. print('右滑动一下')
  20. print('发现美女,打招呼')
  21. Tantan('女', 28)
  22. print("----" * 30)
  23. # 练习:比大小,返回大的数字
  24. def max_(a, b):
  25. # if a > b:
  26. # return a
  27. # else:
  28. # return b
  29. # return a if a > b else b
  30. return a if a > b else b
  31. print(max_(100, 200))
  32. print("----" * 30)
  33. # 扩展:三元运算符
  34. a = '饼'
  35. b = '西瓜'
  36. ret = a if 3 > 2 else b
  37. print(ret)
  38. print("----" * 30)
  39. # 2.关键字参数 一一对应。
  40. # 函数参数较多 记形参顺序较麻烦时,需要关键字参数
  41. def Tantan(sex,age,area):
  42. print('筛选性别%s, %s附近,年龄%s左右的美女' %(sex,area,age))
  43. print('搜索')
  44. print('左滑动一下')
  45. print('右滑动一下')
  46. print('发现美女,打招呼')
  47. Tantan(sex='女',area='南山区',age='28')
  48. print("----" * 30)
  49. # 3.混合参数 一一对应,关键字参数必须要在位置参数后面。
  50. def Tantan(sex,age,area):
  51. print('筛选性别%s,%s 附近,年龄%s左右的美女' %(sex,area,age))
  52. print('搜索')
  53. print('左滑动一下')
  54. print('右滑动一下')
  55. print('发现美女,打招呼')
  56. Tantan('女',28,area='南山区')
  57. print("----" * 30)
  58. # 二 形参角度
  59. # 1.位置参数 从左至右,一一对应。
  60. def Tantan(sex,age):
  61. print('筛选性别%s,年龄%s左右' %(sex,age))
  62. print('搜索')
  63. print('左滑动一下')
  64. print('右滑动一下')
  65. print('发现美女,打招呼')
  66. Tantan('女', 28)
  67. print("----" * 30)
  68. # 2.默认参数 : 使用最多的一般不更改的参数,默认参数一定放在位置参数后面
  69. def Tantan(area,age,sex='girl'):
  70. print('筛选性别%s, %s 附近,年龄%s左右的美女' %(sex,area,age))
  71. print('搜索')
  72. print('左滑动一下')
  73. print('右滑动一下')
  74. print('发现美女,打招呼')
  75. Tantan('南山区',28,'laddboy')
  76. print("----" * 30)
  77. # 3.万能参数(动态参数) *args, **kwargs
  78. def Tantan(*args, **kwargs):
  79. # 函数的定义: * 代表聚合。
  80. # * 将实参角度所有的位置参数放到一个元祖中,并将元组给了args
  81. # ** 将实参角度所有的关键字参数放到一个字典中,并将字典给了kwargs
  82. print(args)
  83. print(kwargs)
  84. # print('筛选地域:%s,年龄%s' % args)
  85. # print('搜索')
  86. # print('左滑动一下')
  87. # print('右滑动一下')
  88. # print('发现美女,打招呼')
  89. # print(kwargs)
  90. # Tantan('南山区','28', '性格好','身材好', '家境好')
  91. Tantan('南山区', '28', body='身材好', voice='萝莉音', money='白富美')
  92. print("----" * 30)
  93. def Tantan(*args,**kwargs):
  94. # 函数的定义: * 代表聚合。
  95. # * 将实参角度所有的位置参数放到一个元祖中,并将元组给了args
  96. # ** 将实参角度所有的关键字参数放到一个字典中,并将字典给了kwargs
  97. print(args)
  98. print(kwargs)
  99. Tantan('南山区','28',body='身材好',voice='萝莉音',money='白富美')
  100. print("---- 1 -----------------------------------------")
  101. l1 = [1, 2, 3]
  102. l2 = (4, 5, 6)
  103. Tantan(*l1, *l2) # 函数的执行:*iterable 将l1打散,添加到args
  104. print("---- 2 -----------------------------------------")
  105. Tantan(1, 2, 3, 4, 5, 6)
  106. print("---- 3 -----------------------------------------")
  107. dic1 = {'name': "tom"}
  108. dic2 = {'age': 46}
  109. Tantan(**dic1, **dic2) # **dic1 将dic1打散,将所有的键值对添加到kwargs
  110. print("---- 4 -----------------------------------------")
  111. # 函数参数
  112. # 实参
  113. # 位置参数
  114. # 关键字参数
  115. # 混合参数
  116. # 形参
  117. # 位置参数
  118. # 默认参数
  119. # 万能参数
  120. # 形参的最终顺序
  121. # 位置参数 *args 默认参数 **kwargs
  122. def func(a, b, *args, sex='女', **kwargs):
  123. print(a, b, sex, args, kwargs)
  124. func(1, 2, 4, 5, 6, name='tom', age=73)

函数的名称空间和顺序

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. """
  4. 函数里面的变量,在函数外面能直接引用么?
  5. def func1():
  6. m = 1
  7. print(m)
  8. print(m) #这行报的错
  9. 报错了:
  10. NameError: name 'm' is not defined
  11. 我们首先回忆一下Python代码运行的时候遇到函数是怎么做的,从Python解释器开始执行之后,就在内存中开辟里一个空间
  12. 每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征性的将函数名读入内存,
  13. 表示知道这个函数存在了,至于函数内部的变量和逻辑,解释器根本不关心。等执行到函数调用的时候,
  14. Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,
  15. 而函数中的变量会储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。
  16. 我们给这个‘存放名字与值的关系’的空间起了一个名字 --- 命名空间。
  17. 代码在运行伊始,创建存储“变量名与值的关系”的空间叫做全局命名空间;
  18. 在函数的运行中开辟的临时的空间叫做局部命名空间。
  19. """
  20. # python的空间分三种:
  21. # 全局名称空间
  22. # 局部名称空间
  23. # 内置名称空间 print() len() 内置函数
  24. #
  25. # 举例
  26. # def func():
  27. # name = 'tom'
  28. # func()
  29. # print(name) # 报错
  30. # func()
  31. # python中的作用域分两种:
  32. # 全局作用域:内置名称空间 全局名称空间
  33. # 局部作用域:局部名称空间
  34. # 取值顺序: 就近原则
  35. # 局部变量先到局部寻找,局部没找到才去全局找,全局没找到,去内置找,都没找到,就报错
  36. # 全局变量直接在全局查找,全局没有就去内置空间查找,如果没有,就报错
  37. # 局部名称空间 ———> 全局名称空间 ———> 内置名称空间 (这个顺序不可逆)
  38. input = 'tom'
  39. def func():
  40. input = 'jerry'
  41. print(input)
  42. func()
  43. print(input)
  44. # 加载顺序
  45. # 所有的东西要加载到内存才运行
  46. # 内置名称空间 ---> 全局名称空间 ---> 局部名称空间

函数的嵌套

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 函数的嵌套
  4. # 举例1
  5. def func():
  6. print(111)
  7. def func1():
  8. print(222)
  9. func()
  10. def func3():
  11. print(333)
  12. func1()
  13. print(444)
  14. func()
  15. print(555)
  16. ## 444 111 555
  17. print("---------------- 1 -------------------------")
  18. #举例2
  19. def func():
  20. print(111)
  21. def func1():
  22. print(222)
  23. func()
  24. def func3():
  25. print(333)
  26. func1()
  27. print(444)
  28. func3()
  29. print(555)
  30. # 444 333 222 111 555
  31. print("---------------- 2 -------------------------")
  32. def wrapper():
  33. print(222)
  34. def inner():
  35. print(111)
  36. print(444)
  37. inner()
  38. print(333)
  39. wrapper()
  40. # 222 444 111 333

内置函数globals、locals

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 内置函数globals() locals()
  4. name = 'tom'
  5. age = 46
  6. def func():
  7. sex = '男'
  8. hobby = '女'
  9. print(globals()) # 返回一个字典:全局作用域的所有内容
  10. # {..., 'name': 'tom', 'age': 46, ...} 两边还有其他的内容
  11. print(locals()) # 返回一个字典:当前位置的内容
  12. # {'hobby': '女', 'sex': '男'}
  13. func()
  14. print(globals()) # 返回一个字典:全局作用域的所有内容
  15. # {..., 'name': 'tom', 'age': 46, ...} 两边还有其他的内容
  16. print(locals()) # 返回一个字典:当前位置的内容
  17. # {..., 'name': 'tom', 'age': 46, ...} 两边还有其他的内容

函数名的应用

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 函数名的应用
  4. # 1,函数名是一个特殊的变量 函数名() 执行此函数
  5. def func():
  6. print(666)
  7. func()
  8. print("--------------- 1 ------------------")
  9. # 2,函数名可以当做变量进行赋值运算。
  10. def func():
  11. print(666)
  12. f = func
  13. f()
  14. print("--------------- 2 ------------------")
  15. # 3,函数名可以作为容器型数据的元素 ***
  16. def func():
  17. print(666)
  18. def func1():
  19. print(777)
  20. def func2():
  21. print(888)
  22. def func3():
  23. print(999)
  24. l1 = [func, func1, func2, func3]
  25. for i in l1:
  26. i()
  27. dic = {
  28. 1: func,
  29. 2: func1,
  30. 3: func2,
  31. 4: func3,
  32. }
  33. # while 1:
  34. # num = input('请输入序号:').strip()
  35. # num = int(num)
  36. # dic[num]()
  37. print("--------------- 3 ------------------")
  38. # 4,函数名可以作为函数的参数。
  39. def func1():
  40. print(111)
  41. def func2(x):
  42. x()
  43. print(222)
  44. func2(func1)
  45. print("--------------- 4 ------------------")
  46. # 5,函数名可以作为函数的返回值。
  47. def func1():
  48. print(111)
  49. def func2(x):
  50. print(222)
  51. return x
  52. ret = func2(func1)
  53. ret()

关键字global、nonlocal

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # global nonlocal
  4. # global
  5. # 1,声明一个全局变量。
  6. def func():
  7. global name
  8. name = 'tom'
  9. func()
  10. print(name)
  11. print("--------------- 1 ------------------")
  12. # 2,修改一个全局变量。
  13. # 原因:局部作用域只能引用全局变量而不能改变全局变量。如果改变则报错
  14. # global 可以实现通过局部作用域而去改变全局变量
  15. count = 1
  16. def func1():
  17. global count
  18. count += 1
  19. print(count)
  20. func1()
  21. print(count)
  22. print("--------------- 2 ------------------")
  23. # nonlocal: 子级函数可以通过nonlocal修改父级(更高级非全局变量)函数的变量。
  24. # 现象:子级函数可以引用父级函数的变量但是不能修改。
  25. def func():
  26. count = 1
  27. def func1():
  28. def inner():
  29. nonlocal count
  30. count += 1
  31. print(count) # 第二个打印 2
  32. print(count) # 第一个打印 1
  33. inner()
  34. print(count) # 第三个打印 2
  35. func1()
  36. func() # 1 2 2
  37. print("--------------- 3 ------------------")
  38. # 这个不行,会报错
  39. # count = 1
  40. # def func1():
  41. # def inner():
  42. # nonlocal count # 这里会报错,因为count是全局变量了,不能使用nonlocal
  43. # count += 1
  44. # print(count)
  45. # inner()
  46. #
  47. # func1()

练习题1

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. """
  4. # 1、 文件a1.txt内容
  5. # 序号 部门 人数 平均年龄 备注
  6. # 1 python 30 26 单身狗
  7. # 2 Linux 26 30 没对象
  8. # 3 运营部 20 24 女生多
  9. # 通过代码,将其构建成这种数据类型:
  10. # [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},......]
  11. """
  12. # 方法1
  13. l1 = []
  14. with open('a1.txt', encoding='utf-8', mode='r') as f:
  15. k1, k2, k3, k4, k5 = f.readline().strip('').split()
  16. for line in f:
  17. dic = {}
  18. v1, v2, v3, v4, v5 = line.strip('').split()
  19. dic[k1] = v1
  20. dic[k2] = v2
  21. dic[k3] = v3
  22. dic[k4] = v4
  23. dic[k5] = v5
  24. l1.append(dic)
  25. print(l1)
  26. print("----------------------- 1 --------------------------------")
  27. # 方法2
  28. l1 = []
  29. with open('a1.txt', encoding='utf-8', mode='r') as f:
  30. # 读取第一行作为键
  31. head_list = f.readline().strip('').split()
  32. # print(head_list)
  33. for line in f:
  34. # 获取每一行为一个列表
  35. line_list = line.strip().split()
  36. # print(line_list)
  37. dic = {}
  38. # 循环上面的列表 enumerate函数的用法 会返回索引k和值v
  39. for k, v in enumerate(line_list):
  40. # print(k, v)
  41. dic[head_list[k]] = v
  42. l1.append(dic)
  43. print(l1)
  44. print("----------------------- 2 --------------------------------")
  45. # 2、 传入函数的字符串中,统计[数字]、[字母]、[空格] 以及 [其他]的个数,并返回结果。
  46. def my_count(str1):
  47. """
  48. 统计数字,字母,空格,其他的字符个数
  49. :param str1: 字符串
  50. :return: 数字,字母,空格,其他
  51. """
  52. count_num = 0
  53. count_letter = 0
  54. count_space = 0
  55. count_other = 0
  56. for i in str1:
  57. if i.isdigit():
  58. count_num += 1
  59. elif i.isalpha():
  60. count_letter += 1
  61. elif i == ' ':
  62. count_space += 1
  63. else:
  64. count_other += 1
  65. return '数字[%s] 字母[%s] 空格[%s] 其他[%s]' % (count_num, count_letter, count_space, count_other)
  66. print(my_count('1 b # 3s'))
  67. print("----------------------- 3 --------------------------------")
  68. # 3、 写函数,接收两个数字参数,返回比较大的那个数字
  69. def my_compare(*args):
  70. """
  71. 比较两个数大小
  72. :param args:传入2个数字
  73. :return: 大的数字
  74. """
  75. return args[0] if args[0] > args [1] else args[1]
  76. print(my_compare(3,62))
  77. print("----------------------- 4 --------------------------------")
  78. # 4、 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者
  79. # dic = {"k1": "v1v1", "k2": [11,22,33,44]} PS:字典中的value只能是字符串或列表
  80. def func(**kwargs):
  81. """
  82. 检查字典值的长度,大于2,保留前两个长度的内容
  83. :param kwargs: 字典
  84. :return: 新列表
  85. """
  86. for k,v in kwargs.items():
  87. kwargs[k] = v[:2] if len(v) > 2 else v
  88. return kwargs
  89. dic = {"k1": "v1v1", "k2": [11,22,33,44]}
  90. ret = func(**dic)
  91. print(ret)
  92. print("----------------------- 5 --------------------------------")
  93. # 5、写函数,此函数只接收一个参数且此参数必须是列表数据类型,
  94. # 此函数完成的功能是返回给调用者一个字典,此字典的键值对为此列表的索引及对应的元素。例如传入的列表为:[11,22,33]
  95. # 返回的字典为{0:11,1:22,2:33}
  96. def fun(lis):
  97. """
  98. 接受列表数据类型,返回字典
  99. :param args: 列表
  100. :return: 字典
  101. """
  102. if type(lis) is list:
  103. dic = {}
  104. for k in range(len(lis)):
  105. dic[k] = lis[k]
  106. return dic
  107. else:
  108. return '参数必须为列表'
  109. l1 = [11,22,33,]
  110. print(fun(l1))
  111. print("----------------------- 6 --------------------------------")
  112. # 6、写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。用户通过输入这四个内容,然后将这
  113. # 四个内容传入到函数中,此函数接收到这四个内容,将内容追加到一个student_msg文件中
  114. def func(name,sex,age,edu):
  115. """
  116. 接收四个参数,将接收的内容追加到student_msg文件中
  117. :param name: 姓名
  118. :param sex: 性别
  119. :param age: 年龄
  120. :param edu: 学历
  121. :return:
  122. """
  123. with open('student_msg', encoding='utf-8', mode='a+') as f:
  124. f.write('%s %s %s %s \n' % (name, sex, age, edu) )
  125. f.flush()
  126. # name = input('name>>>:')
  127. # sex = input('sex>>>:')
  128. # age = input('age>>>:')
  129. # edu = input('edu>>>:')
  130. # func(name,sex,age,edu)
  131. print("----------------------- 7 --------------------------------")
  132. # 7、 对第6题升级:支持用户持续输入,Q或者q退出,性别默认为男,如果遇到女学生,则把性别输入女
  133. def func(name,age,edu,sex='男'):
  134. """
  135. 接收四个参数,将接收的内容追加到student_msg文件中
  136. :param name: 姓名
  137. :param sex: 性别
  138. :param age: 年龄
  139. :param edu: 学历
  140. :return:
  141. """
  142. with open('student_msg', encoding='utf-8', mode='a+') as f:
  143. f.write('%s %s %s %s \n' % (name, sex, age, edu) )
  144. f.flush()
  145. # while 1:
  146. # name = input('name(Q/q exit)>>>:')
  147. # if name.strip().lower() == 'q':
  148. # break
  149. # sex = input('sex>>>:')
  150. # age = input('age>>>:')
  151. # edu = input('edu>>>:')
  152. #
  153. # if sex.strip() == '男':
  154. # func(name,age,edu)
  155. # else:
  156. # func(name,age,edu,sex)
  157. print("----------------------- 8 --------------------------------")
  158. # 8、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作
  159. import os
  160. def modify_file(file_name,old_modify,new_modify):
  161. """
  162. 文本修改
  163. :param file_name: 文件
  164. :param old_modify: 被修改的内容
  165. :param new_modify: 修改的内容
  166. :return: True
  167. """
  168. if os.path.exists(file_name):
  169. with open(file_name, encoding='utf-8', mode='r') as f1, open(file_name+'.bak', encoding='utf-8',mode='w') as f2:
  170. for old_line in f1:
  171. new_line = old_line.replace(old_modify,new_modify)
  172. f2.write(new_line)
  173. f2.flush()
  174. os.remove(file_name)
  175. os.rename(file_name+'.bak',file_name)
  176. return True
  177. else:
  178. return '文件不存在'
  179. # file_name = input("请输入文件名称:")
  180. # old_modify = input("请输入需要修改的内容:")
  181. # new_modify = input("请输入修改后的内容:")
  182. # ret = modify_file(file_name,old_modify,new_modify)
  183. # print(ret)
  184. print("----------------------- 9 --------------------------------")
  185. # 9、读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
  186. a = 10
  187. b = 20
  188. def test5(a, b): # a=20 b=10
  189. a=3
  190. b=5
  191. print(a, b) #a=3 b=5
  192. c = test5(b, a) # a=3 b=5 因为在函数内部打印的,先从局部变量开始找
  193. print(c) #none 函数没有return,所以没有返回值C=None。
  194. print("----------------------- 10 --------------------------------")
  195. # 10、写函数,传入函数中多个实参(均为可迭代对象如字符串,列表,元祖,集合等),将每个实参的每个元素依次
  196. # 添加到函数的动态参数args里面
  197. # 例如 传入函数两个参数[1,2,3] (22,33)最终args为(1,2,3,22,33)
  198. def func(*args):
  199. """
  200. :param args:
  201. :return:
  202. """
  203. print(args)
  204. l1 = [1, 2, 3]
  205. t1 = (22, 33)
  206. func(*l1, *t1)
  207. print("----------------------- 11 --------------------------------")
  208. # 11、写函数,传入函数中多个实参(实参均为字典),将每个实参的键值对依次添加到函数的动态参数kwargs里面
  209. # 例如 传入函数两个参数{‘name’:’alex’} {‘age’:1000}最终kwargs为{‘name’:’alex’ ,‘age’:1000}
  210. def fun(**kwargs):
  211. """
  212. :param kwargs:
  213. :return:
  214. """
  215. print(kwargs)
  216. dic1 = {'name': 'alex'}
  217. dic2 = {'age': 1000}
  218. fun(**dic1, **dic2)
  219. print("----------------------- 12 --------------------------------")
  220. # 12、下面代码成立么?如果不成立为什么报错?怎么解决?
  221. # 题目一:
  222. a = 2
  223. def wrapper():
  224. print(a)
  225. wrapper() # 2
  226. # 题目二:
  227. # a = 2
  228. # def wrapper():
  229. # a += 1 # 报错
  230. # print(a)
  231. # wrapper()
  232. # 题目三:
  233. def wrapper():
  234. a = 1
  235. def inner():
  236. print(a)
  237. inner()
  238. wrapper() # 1
  239. # 题目四:
  240. # def wrapper():
  241. # a = 1
  242. # def inner():
  243. # a += 1 # 报错
  244. # print(a)
  245. # inner()
  246. # wrapper()
  247. # 题目二修改为如下
  248. a = 2
  249. def wrapper():
  250. global a
  251. a += 1
  252. print(a)
  253. wrapper()
  254. # 题目四修改为如下
  255. def wrapper():
  256. a = 1
  257. def inner():
  258. nonlocal a
  259. a += 1
  260. print(a)
  261. inner()
  262. wrapper()
  263. print("----------------------- 13 --------------------------------")
  264. # 13、写函数,接收两个数字参数,将较小的数字返回
  265. def min_(a,b):
  266. return a if a < b else b
  267. print(min_(13,2))
  268. print("----------------------- 14 --------------------------------")
  269. # 14、写函数,接收一个参数(此参数类型必须是可迭代对象),将可迭代对象的每个元素以’_’相连接,形成新的字符串,并返回
  270. # 例如 传入的可迭代对象为[1,'老男孩','武sir']返回的结果为’1_老男孩_武sir’
  271. def fun(item):
  272. """
  273. :param item:
  274. :return:
  275. """
  276. s = ''
  277. for i in item:
  278. s = s + '%s_' % (i)
  279. s = s.rstrip('_')
  280. return s
  281. l1 = [1, '深圳', '南山']
  282. ret = fun(l1)
  283. print(ret)
  284. print("----------------------- 15 --------------------------------")
  285. # 15、写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
  286. # 例如:如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此题用到max(),min()内置函数)
  287. def min_max(*args):
  288. dic = {'max':max(args),'min':min(args)}
  289. return dic
  290. ret = min_max(2,5,7,8,4)
  291. print(ret)
  292. print("----------------------- 16 --------------------------------")
  293. # 16、写函数,传入一个参数n,返回n的阶乘
  294. # 例如:cal(7) 计算7*6*5*4*3*2*1
  295. def fun(n):
  296. s = 1
  297. for i in range(1, n+1):
  298. s = s * i
  299. print(s)
  300. fun(7)
  301. print(7 * 6 * 5 * 4 * 3 * 2 * 1)
  302. print("----------------------- 17 --------------------------------")
  303. # 17、写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
  304. # 例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]
  305. def poker():
  306. poker_list = []
  307. l1 = ['红心','草花','黑桃','方片']
  308. l2 = ['A',2,3,4,5,6,7,8,9,10,'J','Q','K']
  309. for i in l1:
  310. for k in l2:
  311. poker_list.append((i,k))
  312. return poker_list
  313. print(poker())
  314. print("----------------------- 18 --------------------------------")
  315. # 18、 有如下函数:
  316. # def wrapper():
  317. # def inner():
  318. # print(666)
  319. # wrapper()
  320. # 你可以任意添加代码,用两种或以上的方法,执行inner函数
  321. #方法1
  322. def wrapper():
  323. def inner():
  324. print(666)
  325. inner()
  326. wrapper()
  327. #方法2
  328. def wrapper():
  329. def inner():
  330. print(666)
  331. return inner
  332. ret = wrapper()
  333. ret()

练习题2

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. import os
  4. """
  5. 题目:用函数完成登录注册以及购物车的功能
  6. 需求:
  7. 1,启动程序,用户可选择四个选项:登录,注册,购物,退出。
  8. 2,用户注册,用户名不能重复,注册成功之后,用户名密码记录到文件中。
  9. 3,用户登录,用户名密码从文件中读取,进行三次验证,验证不成功则退出整个程序。
  10. 4,用户登录成功之后才能选择购物功能进行购物,购物功能(就是将购物车封装到购物的函数中)。
  11. 5,退出则是退出整个程序。
  12. """
  13. # 设定登录标志位
  14. login_flag = False
  15. def register():
  16. """
  17. 注册
  18. :return:None
  19. """
  20. while 1:
  21. username = input('\n请输入你想注册的账户名称>>>:').strip()
  22. userpwd = input('请输入你想设置的登录密码>>>:').strip()
  23. # 存储用户信息目录
  24. if not os.path.exists("user_info"):
  25. os.mkdir("./user_info")
  26. if os.path.exists("user_info/%s" % (username)):
  27. print("该用户名已经被注册,请重新输入\n")
  28. continue
  29. with open("user_info/%s" % (username), encoding='utf-8', mode='w') as f:
  30. f.write("%s|%s|0" % (username,userpwd) )
  31. f.flush()
  32. print('账号注册成功!\n')
  33. return
  34. def login():
  35. """
  36. 登录
  37. :return:None
  38. """
  39. # 密码可输错次数
  40. count = 3
  41. while 1:
  42. username = input("\n请输入登录账号(返回B/b)>>>:").strip()
  43. if username.strip().lower() == 'b':
  44. print('\n')
  45. break
  46. userpwd = input("请输入登录密码>>>:").strip()
  47. # 用户是否存在
  48. if os.path.exists('user_info/%s' % (username) ):
  49. # 获取用户登录密码和密码输错次数
  50. with open('user_info/%s' % (username), encoding='utf-8', mode='r') as f1:
  51. user_l1 = f1.readline().strip().split('|')
  52. pwd = str(user_l1[1])
  53. count_pwd = int(user_l1[2])
  54. # 账号是否冻结
  55. if count_pwd == count:
  56. print("账号 [%s] 已经被冻结,请联系管理员解除冻结或使用其他账号登陆\n" % (username))
  57. continue
  58. # 密码是否正确
  59. if userpwd == pwd:
  60. print('登录成功!\n')
  61. # 重置密码输错次数
  62. count_pwd = 0
  63. user_l1[2] = count_pwd
  64. with open('user_info/%s' % (username), encoding='utf-8', mode='w') as f2:
  65. f2.write("%s|%s|%s" % (user_l1[0], user_l1[1], user_l1[2]))
  66. f2.flush()
  67. # 登录成功,修改默认的标志位
  68. global login_flag
  69. login_flag = True
  70. return
  71. else:
  72. # 登录失败,密码输错次数 +1
  73. count_pwd += 1
  74. user_l1[2] = count_pwd
  75. with open('user_info/%s' % (username), encoding='utf-8', mode='w') as f3:
  76. f3.write("%s|%s|%s" % (user_l1[0] ,user_l1[1], user_l1[2]) )
  77. f3.flush
  78. # 密码连续输错3次,直接退出程序
  79. if count_pwd == count:
  80. exit('[%s] 账号密码连续输错3次,程序退出!' % (username))
  81. print('密码错误。\n')
  82. continue
  83. else:
  84. print('用户不存在!')
  85. def recharge():
  86. """
  87. 充值
  88. :return:True,用户余额
  89. """
  90. while 1:
  91. user_balance = input("请先给账号充值(返回B/b):")
  92. if user_balance.lower() == "b":
  93. print('')
  94. return False
  95. elif user_balance.isdigit():
  96. user_balance = int(user_balance)
  97. print("账号充值成功!余额为[%s]元\n" % (user_balance))
  98. return True,user_balance
  99. else:
  100. print("输入有误,请重新输入。")
  101. def jiesuan(user_shopping_cart,user_balance):
  102. """
  103. 结算功能
  104. :param user_shopping_cart: 用户选购商品的临时字典
  105. :param user_balance: 用户充值的余额
  106. :return:None
  107. """
  108. while 1:
  109. # 显示购物车里的商品
  110. print("\n您的购车里商品如下:")
  111. for k in user_shopping_cart:
  112. print("\t商品[%s] 数量[%s] 价格[%s]" % (k, user_shopping_cart[k]['number'], user_shopping_cart[k]['price']))
  113. # 购物车所有商品总价
  114. shopp_cart_total = 0
  115. print("\n\n正在结算,请稍候...")
  116. # 计算商品总价格
  117. for k in user_shopping_cart:
  118. shopp_cart_total = shopp_cart_total + user_shopping_cart[k]['number'] * user_shopping_cart[k]['price']
  119. # 余额是否能够支付
  120. if user_balance >= shopp_cart_total:
  121. print("您本次总共需要支付[%s]元,余额为[%s]元" % (shopp_cart_total, user_balance))
  122. print("\n您本次购买的商品详单如下:")
  123. for k in user_shopping_cart:
  124. print('\t商品[%s] 数量[%s] 价格[%s]'%(k,user_shopping_cart[k]['number'],user_shopping_cart[k]['price']))
  125. print("\n本次总共消费[%s]元,账户余额为[%s]元" % (shopp_cart_total, user_balance - shopp_cart_total))
  126. print("\n购买成功!\n")
  127. return
  128. else:
  129. print("本次总共需要支付[%s]元 你的余额为[%s]元" % (shopp_cart_total, user_balance))
  130. print("余额不足,请先删除购物车里的一些商品再去结算哟\n")
  131. while 1:
  132. print("\n购物车的商品列表如下:")
  133. for k in user_shopping_cart:
  134. print('\t商品[%s] 数量[%s] 价格[%s]' % (k, user_shopping_cart[k]['number'], user_shopping_cart[k]['price']))
  135. user_choice2 = input("请输入你想删除的商品名称:")
  136. # 从购物车删除商品
  137. if user_shopping_cart.get(user_choice2):
  138. # 商品数量为1,直接删除。否则减少商品的数量1
  139. if user_shopping_cart[user_choice2]['number'] == 1:
  140. del user_shopping_cart[user_choice2]
  141. print('商品[%s]已从购物车删除' % (user_choice2))
  142. elif user_shopping_cart[user_choice2]['number'] > 1:
  143. user_shopping_cart[user_choice2]['number'] -= 1
  144. print("商品[%s]数量减少1件" % (user_choice2))
  145. break
  146. else:
  147. print("\n输入的商品名称有误,请重新输入")
  148. def buy():
  149. """
  150. 购物
  151. :return:None
  152. """
  153. # 默认标志为是否被修改,即是否已经登录
  154. if login_flag:
  155. print('\n')
  156. # 获取充值函数返回值,为一个元组(True,user_balance)
  157. ret = recharge()
  158. if ret[0]:
  159. # 用户余额
  160. user_balance = ret[1]
  161. # 用户选购商品临时购物车
  162. user_shopping_cart = {}
  163. # 商品列表
  164. goods_dic = {
  165. "1": {"name": "电脑", "price": 1999, },
  166. "2": {"name": "鼠标", "price": 10, },
  167. "3": {"name": "键盘", "price": 60, },
  168. "4": {"name": "手机", "price": 4000, },
  169. "5": {"name": "ipad", "price": 2999, },
  170. "n": {"name": "购物车结算", "price": '', },
  171. }
  172. while 1:
  173. print("下列是您可以选购的商品(退出Q/q):")
  174. for key in goods_dic:
  175. print('\t', key, goods_dic[key]['name'], goods_dic[key]['price'])
  176. user_choice = input("请输入你想购买的商品序号:")
  177. if user_choice.lower() == "q":
  178. print("退出购物商城")
  179. break
  180. # 结算
  181. elif user_choice == "n":
  182. jiesuan(user_shopping_cart,user_balance)
  183. break
  184. # 添加商品到用户购物车
  185. elif goods_dic.get(user_choice):
  186. # 判断购物车是否已经有该商品,如果有直接数量加1,没有则创建一个新的键值对
  187. if user_shopping_cart.get(goods_dic[user_choice]['name']):
  188. user_shopping_cart[goods_dic[user_choice]['name']]['number'] += 1
  189. else:
  190. user_shopping_cart[goods_dic[user_choice]['name']] = {"number": 1,"price": goods_dic[user_choice]['price']}
  191. print("\n商品[%s] 价格[%s] " % (goods_dic[user_choice]['name'], goods_dic[user_choice]['price']))
  192. print('添加到购物车成功!\n')
  193. else:
  194. print("输入有误,请重新输入哦\n")
  195. else:
  196. print('请先登录哦\n')
  197. def sign_out():
  198. """
  199. 退出程序
  200. :return:None
  201. """
  202. exit('退出程序!')
  203. def display():
  204. """
  205. 程序入口,显示
  206. :return:None
  207. """
  208. msg = """---- 欢迎来到老男孩购物商城 ----
  209. 1 注册
  210. 2 登录
  211. 3 购物
  212. 4 退出
  213. """
  214. dic = {
  215. '1': register,
  216. '2': login,
  217. '3': buy,
  218. '4': sign_out,
  219. }
  220. while 1:
  221. print(msg)
  222. keys = input('请输入你要选择的操作序号>>>:')
  223. if keys in dic:
  224. dic[keys]()
  225. else:
  226. print('输入有误,请输入序号哟')
  227. continue
  228. if __name__ == '__main__':
  229. display()

Python语言系列-03-文件操作和函数的更多相关文章

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

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

  2. Python学习系列之文件操作

    Pyhton文件打开方式 with= open('文件路径','打开模式') as f:#PS:python3提供了with语句来帮我们自动调用close方法,所以说无论打开文件是否出错都能自动正确的 ...

  3. C语言样式的文件操作函数

    使用C语言样式的文件操作函数,需要包含stdio.h头文件. 1.打开文件的函数: //oflag的取值为“w”或“r”,分别表示以写或读的方式打开 FILE* fd = fopen(filename ...

  4. python 文件操作的函数

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

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

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

  6. Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

     上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

  7. Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释

     上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...

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

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

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

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

随机推荐

  1. AcWing 106. 动态中位数

    依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数. #include<bits/stdc++.h> using namespace std; pri ...

  2. Linux:Ubuntu配置jdk环境变量

    1.下载jdk 推荐官网:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 下载tar.gz包即可. ...

  3. Spring data Jpa 提供的validator验证

  4. 二进制方式搭建Kubernetes集群

    环境准备: 演练暂时用单节点一台master和一台node节点来进行部署搭建(kubernetes 1.19版本) 角色 IP 组件 master 10.129.246.114 kube-apiser ...

  5. ZSH主题

    All the current themes can be found in the themes/ directory in the oh-my-zsh distribution. See list ...

  6. 以太网MAC地址组成与交换机基本知识

    以太网MAC地址 MAC地址由48位二进制组成,通常分为六段,用十六进制表示,工作在数据链路层. 数据链路层功能: 链路的建立,维护与拆除 帧包装,帧传输,帧同步 帧的差错恢复 简单的流量控制 第八位 ...

  7. Java Map 集合类在selenium自动化测试设计中的应用

    我们在设计自动化测试用例的时候,往往很多工作是在处理测试的数据. 测试数据无论用Excel 文件, XML文件或者任何一种形式测存储方式,都会设计到参数化以及我们对数据的操作. 这个时候,我们会用到以 ...

  8. EditPlus运行java时如何从键盘输入数据

    在练习Java的Scanner时,EditPlus如何读取从键盘输入的数呢? 例如如下程序,编译通过,运行时却输入不了数据: 1 package myP101; 2 3 import java.uti ...

  9. Beautifulsoup网页解析——爬取豆瓣排行榜分类接口

    我们在网页爬取的过程中,会通过requests成功的获取到所需要的信息,而且,在返回的网页信息中,也是通过HTML代码的形式进行展示的.HTML代码都是通过固定的标签组合来实现页面信息的展示,所以,最 ...

  10. Optional 的使用会导致性能下降吗?

    几天前,我在论坛上发了一篇关于Optional 的文章.其中一条评论是一个非常好的问题: Optional 的使用会导致性能下降吗? 答案是: 是的,它会的.但是你应该担心吗? 使用Optional的 ...