闭包

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 什么是闭包
  4. # 1,闭包存在于函数中
  5. # 2,闭包就是内层函数对外层函数(非全局变量)的引用
  6. # 3,最内层函数名会被逐层的返回,直至返回给最外层
  7. # 不是闭包,name 是全局变量
  8. # name = 1
  9. # def func():
  10. # print(name)
  11. # 这才是闭包
  12. def func():
  13. name = 'tom'
  14. def inner():
  15. print(name)
  16. return inner
  17. ret = func()
  18. print(ret.__closure__) # (<cell ...>,) 如果返回cell,就证明是一个闭包。返回None 就不是闭包
  19. print(ret.__closure__[0].cell_contents)
  20. print("------------- 1 --------------------")
  21. # 这也是闭包
  22. def func(name):
  23. # name = 'tom' # name参数 相当于这行代码
  24. def inner():
  25. print(name)
  26. return inner
  27. n1 = 'tom'
  28. ret = func(n1)
  29. print(ret.__closure__)
  30. print("------------- 2 --------------------")
  31. # 闭包的作用
  32. # 解释器遇到闭包,会触发一个机制,这个闭包不会随着函数的结束而释放
  33. # 1,不是闭包的情况,函数里面定义的变量会随着函数的结束而释放
  34. def func(step):
  35. num = 1
  36. num += step
  37. print(num)
  38. for i in range(5):
  39. func(2)
  40. print("------------- 3 --------------------")
  41. # 3 3 3 3 3
  42. # 2,闭包情况下:不会随着函数的结束而释放
  43. def func(step):
  44. num = 1
  45. def inner():
  46. nonlocal num
  47. num += step
  48. print(num)
  49. return inner
  50. f = func(2)
  51. for i in range(5):
  52. f()
  53. print("------------- 4 --------------------")
  54. # 3 5 7 9 11
  55. # 闭包举例 爬虫
  56. from urllib.request import urlopen
  57. import ssl
  58. def but():
  59. ssl._create_default_https_context = ssl._create_unverified_context # 取消ssl证书验证
  60. context = urlopen("https://www.cnblogs.com/lichengguo/p/14649122.html").read()
  61. def get_content():
  62. return context
  63. return get_content
  64. fn = but()
  65. content = fn() # 获取内容
  66. print(content.decode('utf-8')) # 中文显示
  67. ## 中间又执行了很多步程序,然后再次调用爬虫爬取的内容
  68. ## 不需要再次请求URL了,直接从变量中获取内容即可
  69. content2 = fn()
  70. print(content2.decode('utf-8'))

装饰器

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. import time
  4. # 装饰器
  5. # 需求 测试其他函数的执行效率
  6. # 第一版:写一个功能函数测试其他同事的函数执行效率
  7. def func():
  8. time.sleep(0.2)
  9. print('非常复杂的函数')
  10. def func1():
  11. time.sleep(0.3)
  12. print('超级复杂的函数')
  13. # 如果被测试的函数很多的话,代码不能重用,会冗余
  14. start_time = time.time()
  15. func()
  16. end_time = time.time()
  17. print('此函数耗时秒数 %s' % (end_time - start_time))
  18. print("------------------ 1 -----------------------")
  19. # 第二版:函数实现这个功能
  20. def func():
  21. time.sleep(0.2)
  22. print('非常复杂')
  23. def func1():
  24. time.sleep(0.3)
  25. print('超级复杂')
  26. def timmer(f):
  27. start_time = time.time()
  28. f()
  29. end_time = time.time()
  30. print('此函数耗时秒数 %s' % (end_time - start_time))
  31. timmer(func)
  32. timmer(func1)
  33. print("------------------ 2 -----------------------")
  34. # 假如函数有1500个,那么你1500个timmer(func),工作量很大
  35. # 你要在不改变函数执行的指令下,同时测试效率
  36. # 第三版:在不改变函数的执行方式下,同时测试执行效率
  37. def func():
  38. time.sleep(0.2)
  39. print('非常复杂')
  40. def func1():
  41. time.sleep(0.3)
  42. print('超级复杂')
  43. def timmer(f):
  44. start_time = time.time()
  45. f()
  46. end_time = time.time()
  47. print('此函数耗时秒数 %s' % (end_time - start_time))
  48. f1 = func
  49. func = timmer
  50. func(f1) # timmer(func)
  51. print("------------------ 3 -----------------------")
  52. # 第四版:装饰器雏形
  53. def func():
  54. time.sleep(0.2)
  55. print('非常复杂')
  56. def func1():
  57. time.sleep(0.3)
  58. print('超级复杂')
  59. def timmer(f): # f = func 函数名
  60. def inner():
  61. start_time = time.time()
  62. f()
  63. end_time = time.time()
  64. print('此函数耗时秒数 %s' % (end_time - start_time))
  65. return inner
  66. func = timmer(func) # 执行timmer函数,将func函数名传给f。等到返回值inner函数名,所以func --> inner
  67. func()
  68. print("------------------ 4 -----------------------")
  69. # 第五版:装饰器雏形的优化,语法糖@
  70. def timmer(f): # f = func 函数名
  71. def inner():
  72. start_time = time.time()
  73. f()
  74. end_time = time.time()
  75. print('此函数耗时秒数 %s' % (end_time - start_time))
  76. return inner
  77. @timmer # func = timmer(func)
  78. def func():
  79. time.sleep(0.2)
  80. print('非常复杂')
  81. #func = timmer(func) # 执行timmer函数,将func函数名传给f。等到返回值inner函数名,所以func --> inner
  82. func()
  83. print("------------------ 5 -----------------------")
  84. # 其他:被装饰函数带有参数
  85. def timmer(f):
  86. def inner(*args, **kwargs): # 函数的定义: * 聚合 args = (1,2,3,444,)
  87. start_time = time.time()
  88. f(*args, **kwargs) # 函数执行: * 打散 f(*(1,2,3,4,5,6,))
  89. end_time = time.time()
  90. print('此函数耗时秒数 %s' % (end_time - start_time))
  91. return inner
  92. @timmer # func = timmer(func)
  93. def func(a, b):
  94. time.sleep(0.2)
  95. print('非常复杂 %s %s ' % (a, b))
  96. func('aaa', 'bbb')
  97. print("------------------ 6 -----------------------")
  98. # 其他:被装饰的函数要有返回值
  99. def timmer(f):
  100. def inner(*args, **kwargs):
  101. start_time = time.time()
  102. ret = f(*args, **kwargs)
  103. end_time = time.time()
  104. print('此函数耗时秒数 %s' % (end_time - start_time))
  105. return ret
  106. return inner
  107. @timmer # func = timmer(func)
  108. def func(a, b):
  109. time.sleep(0.2)
  110. print('非常复杂 %s %s ' % (a, b))
  111. return 666
  112. ret = func('aaa', 'bbb')
  113. print(ret)
  114. print("------------------ 7 -----------------------")
  115. # 装饰器常用格式
  116. def wrapper(f):
  117. def inner(*args,**kwargs):
  118. """执行被装饰函数之前的操作"""
  119. ret = f(*args,**kwargs)
  120. """执行被装饰函数之后的操作"""
  121. return ret
  122. return inner
  123. @wrapper
  124. def func():
  125. print(333)
  126. func()
  127. print("------------------ 8 -----------------------")
  128. # 装饰器小结
  129. # 其实装饰器本质是闭包,他的传参,返回值都是借助内层函数inner,
  130. # 他之所以借助内层函数inner 就是为了让被装饰函数 在装饰器装饰前后,没有任何区别。
  131. # 看起来没有变化。
  132. # 装饰器用途
  133. # 登录认证,打印日志等等。给函数增加额外的功能,但是不能影响函数的执行方式,返回值等
  134. # 日志
  135. def wrapper(f):
  136. def inner(*args, **kwargs):
  137. print("记录日志开始")
  138. ret = f(*args, **kwargs)
  139. print("记录日志结束")
  140. return ret
  141. return inner
  142. @wrapper
  143. def func(a, b, name, age=18):
  144. print('我是被装饰的函数 %s %s' % (name, age))
  145. return a + b
  146. ret = func(1, 2, name="tome")
  147. print(ret)
  148. print("------------------ 9 -----------------------")
  149. # 登录认证
  150. # 需求 三个页面需要登录才能访问,只要有一次登录成功就能访问
  151. # flag = False
  152. #
  153. # def login():
  154. # username = input("账号>>>:")
  155. # password = input("密码>>>:")
  156. # if username == "alnk" and password == "123":
  157. # print('登录成功')
  158. # global flag
  159. # flag = True
  160. #
  161. # def auth(f):
  162. # def inner(*args,**kwargs):
  163. # # while 1:
  164. # if flag:
  165. # ret = f(*args,**kwargs)
  166. # return ret
  167. # else:
  168. # login()
  169. # return inner
  170. #
  171. # @auth
  172. # def comment():
  173. # print('评论页面')
  174. #
  175. # @auth
  176. # def artcle():
  177. # print('文章页面')
  178. #
  179. # @auth
  180. # def dairy():
  181. # print('日记页面')
  182. #
  183. # comment()
  184. # artcle()
  185. # dairy()
  186. # print("------------------ 10 -----------------------")
  187. # 1.对扩展是开放的
  188. # 为什么要对扩展开放呢?
  189. # 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。
  190. # 所以我们必须允许代码扩展、添加新功能。
  191. #
  192. # 2.对修改是封闭的
  193. # 为什么要对修改封闭呢?
  194. # 就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,
  195. # 如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户
  196. # 装饰器完美的遵循了这个开放封闭原则。
  197. # 装饰器的进阶
  198. # 1、正常情况下查看被装饰的函数的说明信息的方法在此处都会失效
  199. # 解决办法
  200. import time
  201. from functools import wraps
  202. def timmer(func):
  203. @wraps(func) # 加在内层函数的正上方
  204. def inner(*args,**kwargs):
  205. start = time.time()
  206. ret = func(*args,**kwargs)
  207. print(time.time() - start)
  208. return ret
  209. return inner
  210. @timmer
  211. def index():
  212. """这是一个主页的信息"""
  213. time.sleep(0.5)
  214. print("from index")
  215. index()
  216. print(index.__doc__)
  217. print("------------------ 11 -----------------------")
  218. # 2、带有参数的装饰器
  219. """
  220. 假如你有成千上万个函数使用了一个装饰器,现在你想把这些装饰器都取消掉,你要怎么做?
  221. 一个一个的取消掉? 没日没夜忙活3天。
  222. 过两天你领导想通了,再让你加上。
  223. """
  224. def outer(flag):
  225. # flag = True # 装饰器开关
  226. def timmer(func):
  227. def inner(*args, **kwargs):
  228. if flag:
  229. print("""执行函数之前要做的""")
  230. ret = func(*args, **kwargs)
  231. if flag:
  232. print("""执行函数之后要做的""")
  233. return ret
  234. return inner
  235. return timmer
  236. @outer(False)
  237. def func():
  238. print(111)
  239. func()
  240. print("------------------ 12 -----------------------")
  241. # 3、多个装饰器,装饰一个函数
  242. def wrapper1(f):
  243. def inner(*args,**kwargs):
  244. print('我是装饰器1 开始')
  245. ret = f(*args,**kwargs)
  246. print("我是装饰器1 结束")
  247. return ret
  248. return inner
  249. def wrapper2(f):
  250. def inner(*args,**kwargs):
  251. print('我是装饰器2 开头')
  252. ret = f(*args,**kwargs)
  253. print('我是装饰器2 结束')
  254. return ret
  255. return inner
  256. @wrapper2
  257. @wrapper1
  258. def func():
  259. print("in func")
  260. func()

可迭代对象和迭代器

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 可迭代对象:这个对象由多个元素组成,他就是可迭代的
  4. # 这个对象内部只要含有"__iter__"方法,他就是可迭代的
  5. for i in 'abc':
  6. print(i)
  7. for i in [1, 2, 3]:
  8. print(i)
  9. # for i in 1234: # 数字是一个不可迭代对象
  10. # print(i)
  11. print("-------------------- 1 -------------------------")
  12. # int bool ---- 不可迭代
  13. # str list tuple dict set bytes range 文件句柄 --可以迭代
  14. # 判断一个对象是否是可迭代的
  15. # 方法一:内部是否有 "__iter__方法"
  16. s1 = "tom"
  17. print("__iter__" in dir(s1)) # True
  18. n = 1
  19. print("__iter__" in dir(n)) # False
  20. print("__iter__" in dir(range)) # True
  21. f = open('a.txt', encoding='utf-8', mode='w')
  22. print("__iter__" in dir(f)) # True
  23. # 方法二:
  24. from collections import Iterable # 判断一个对象是不是可迭代对象
  25. l1 = [1, 2, 3]
  26. print(isinstance(l1, Iterable)) # True
  27. print("-------------------- 2 -------------------------")
  28. # 迭代器:内部含有__iter__方法并且含有__next__方法的就是迭代器
  29. # 如何判断此对象是不是迭代器?
  30. # 方法1
  31. l1 = [1,2,3] # 不是迭代器
  32. print('__iter__' in dir(l1)) # True
  33. print('__next__' in dir(l1)) # False
  34. #方法2
  35. from collections import Iterator
  36. f = open('a.txt', encoding='utf-8', mode='w') # 文件句柄是一个迭代器
  37. # print("__iter__" in dir(f)) # True
  38. # print("__next__" in dir(f)) # True
  39. print(isinstance(f,Iterator)) # True
  40. print("-------------------- 3 -------------------------")
  41. # 迭代器和可迭代对象的区别
  42. # 1、可迭代对象不能直接取值,必须转化成迭代器进行取值,把索引这个方法除外哈
  43. l1 = [1, 2, 3]
  44. for i in l1: # for循环内部会把可迭代对象转化为迭代器,用__next__ 进行取值
  45. print(i)
  46. print("-------------------- 4 -------------------------")
  47. # 将一个可迭代对象转化为迭代器 iter()
  48. l1 = [1, 2, 3]
  49. obj = iter(l1) # 迭代器
  50. print(obj)
  51. print(next(obj))
  52. print(next(obj))
  53. print(next(obj))
  54. print("-------------------- 5 -------------------------")
  55. # 迭代器有什么作用?
  56. # 1,节省内存
  57. # 2,一条路走到底,不反复
  58. # 3,不易看出
  59. # while语句模拟for循环去循环可迭代对象的机制
  60. # 1,将可迭代对象转化成迭代器
  61. # 2,利用next进行取值
  62. # 3,利用异常处理停止循环
  63. l1 = [1, 2, 3, 4, 5, 6]
  64. # obj = l1.__iter__() # 不建议用这种方法把可迭代对象转化为迭代器
  65. obj = iter(l1) # 转换成迭代器
  66. while 1:
  67. # print(obj.__next__()) # 不建议用这种方法去取值
  68. try:
  69. print(next(obj))
  70. except:
  71. break

生成器

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 生成器:本质就是迭代器,自己可以通过代码写出来的迭代器
  4. # 生成器的生成方式
  5. # 1,函数式生成器
  6. # 2,生成器表达式
  7. # 函数式生成器
  8. def func():
  9. # print(111)
  10. yield 5
  11. yield 6
  12. yield 7
  13. yield 8
  14. g = func() # 生成器对象
  15. # 一个next对应一个 yield
  16. print("a")
  17. print(next(g))
  18. print("b")
  19. print(next(g))
  20. print("c")
  21. print(next(g))
  22. print("d")
  23. # print(next(g))
  24. print("e")
  25. print("--------------------- 1 ----------------------")
  26. # 举例
  27. def book():
  28. for i in range(1,501):
  29. print("python书籍 编号%s" % i)
  30. # book()
  31. def book_niu():
  32. for i in range(1,501):
  33. yield "python书籍 编号%s" % i
  34. gen = book_niu()
  35. for i in range(50):
  36. print(next(gen))
  37. print("--------------------- 2 ----------------------")
  38. # 函数中只要有yield 他就不是函数了,他是生成器函数
  39. # yield 与 return的区别
  40. # return直接终止函数,yield不会终止函数。
  41. # return给函数的执行者返回值,yield是给next(生成器对象)返回值。
  42. # send
  43. # send:不仅可以取值,还可以给上一个yield发送一个值
  44. def f():
  45. a = 1
  46. b = 2
  47. count = yield a + b
  48. print(count)
  49. yield 5
  50. yield 6
  51. yield 7
  52. g = f()
  53. # send 与 next的区别
  54. # 1、第一个 yield 不能用 send 取值
  55. # print(g.send(1))
  56. # print(next(g))
  57. # print(next(g))
  58. # print(next(g))
  59. # print(next(g))
  60. # print(next(g))
  61. # print(g.send(None))
  62. # print(g.send(None))
  63. # print(g.send(None))
  64. # print(g.send(None))
  65. # 2、最后一个 yield 永远不会得到 send 发送的值
  66. print(next(g))
  67. print(g.send('a'))
  68. print("--------------------- 3 ----------------------")
  69. # yield from:将一个可迭代对象转化成了生成器返回
  70. def func():
  71. l1 = ['李雷', 'tom', 'jerry', '小明']
  72. yield l1
  73. g = func()
  74. print(next(g))
  75. print("--------------------- 4 ----------------------")
  76. # yield from
  77. def func():
  78. l1 = ['李雷', 'tom', 'jerry', '小明']
  79. yield from l1 # 将一个可迭代对象转化成了生成器返回
  80. g = func()
  81. print(next(g))
  82. print(next(g))
  83. print(next(g))
  84. print(next(g))

生成器表达式和列表推导式

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 生成器表达式 与 列表推导式非常类似
  4. # 列表推导式 [ ]
  5. # 生成器表达式 ( )
  6. # 列表推导式: 用一行代码构建一个列表,列表推导式只能构建简单的或者比较复杂的列表
  7. # 构建一个列表 [100以内所有的偶数],[0,2,4,6,8....100]
  8. l1 = []
  9. for i in range(0, 101, 2):
  10. l1.append(i)
  11. print(l1)
  12. print("------------------ 1 -----------------------------")
  13. # 列表推导式分为两种模式:
  14. # 1,循环模式 [变量(加工后的变量) for 变量 in iterable]
  15. # 构建一个列表,[100以内所有的偶数]
  16. print([i for i in range(0, 101, 2)])
  17. print("------------------ 2 -----------------------------")
  18. # [1,4,9,16,25,36,49]
  19. print([i**2 for i in range(1, 8)])
  20. print("------------------ 3 -----------------------------")
  21. # ['a1', 'a2', .....'a20']
  22. print([("a%s" % i) for i in range(1, 21)])
  23. print("------------------ 4 -----------------------------")
  24. # 2,筛选模式 [变量(加工后的变量) for 变量 in iterable if 条件]
  25. # 30以内能被2整除的数的平方
  26. print([i * i for i in range(1, 31) if i % 2 == 0])
  27. print([i ** 2 for i in range(1, 31) if i % 2 == 0])
  28. print("------------------ 5 -----------------------------")
  29. # [1,2,3,4,6,7,8]
  30. print([i for i in range(1, 9) if i != 5])
  31. print("------------------ 6 -----------------------------")
  32. # 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
  33. l1 = ['jerry', 'ba', 'aa', 'alnk']
  34. print([i.upper() for i in l1 if len(i) > 3])
  35. print("------------------ 7 -----------------------------")
  36. # 将列表中的至少含有两个'e'的人名留下来。
  37. names = [['Tom', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'], ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer']]
  38. # 方法1
  39. l1 = []
  40. for l in names:
  41. for name in l:
  42. if name.count('e') >= 2:
  43. l1.append(name)
  44. print(l1)
  45. print("------------------ 8 -----------------------------")
  46. # 方法2
  47. print([name for l in names for name in l if name.count("e") >= 2])
  48. print("------------------ 9 -----------------------------")
  49. # 生成器表达式:
  50. # 优势:
  51. # 1,一行搞定
  52. # 2,节省内存
  53. #
  54. # 两种模式:
  55. # 1,循环模式(变量(加工后的变量) for 变量 in iterable)
  56. # (变量(加工后的变量) for 变量 in iterable if 条件)
  57. #
  58. #2,筛选模式(变量(加工后的变量) for 变量 in iterable if 条件)

匿名函数

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 匿名函数: 一句话函数 lambda
  4. # 两个数相加
  5. def func(a,b):
  6. return a + b
  7. print(func(1, 3))
  8. func(1, 3)
  9. # 两个数相加
  10. func1 = lambda x,y: x + y
  11. print(func1(1, 2))
  12. # 将 x, y 较大者返回
  13. func2 = lambda x,y: x if x > y else y
  14. print(func2(100,200))

内置函数

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # sum 求和
  4. print(sum([i for i in range(101)]))
  5. print(sum([i for i in range(101)], 100))
  6. print("------------- 1 -----------------")
  7. # min 可以加 key=函数 最小值
  8. # max 可以加 key=函数 最大值
  9. l1 = [3, 4, 1, 2, 7, -5]
  10. print(min(l1))
  11. print(max(l1))
  12. print("------------- 2 -----------------")
  13. l2 = [('a', 3), ('b', 2), ('c', 1)]
  14. def func(x):
  15. return x[1]
  16. print(min(l2, key=func)) # 注意这里min 会先把l2列表中的每个元素传递到func函数中去,然后在取最小的
  17. print(max(l2, key=func))
  18. # 改成lambda
  19. print(min(l2, key=lambda x:x[1]))
  20. print("------------- 3 -----------------")
  21. # reversed 翻转 会生成一个迭代器
  22. l1 = [i for i in range(10)]
  23. print(l1)
  24. from collections import Iterator
  25. g = reversed(l1)
  26. print(isinstance(g,Iterator))
  27. print(next(g))
  28. print(next(g))
  29. print(next(g))
  30. print(next(g))
  31. print("------------- 4 -----------------")
  32. # sorted 排序
  33. l1 = [1,2,8,7,5]
  34. print(sorted(l1))
  35. l2 = [('c',2),('b',3),('a',1)]
  36. print(sorted(l2, key=lambda x:x[1])) # 这个和min max 有点类似
  37. print("------------- 5 -----------------")
  38. # zip 拉链方法,会以最短的那个列表或其他的 去组合。生成一个迭代器
  39. l1 = [1,2,3,4]
  40. tu1 = ('a','b','c')
  41. g = zip(l1,tu1)
  42. print(next(g))
  43. print(next(g))
  44. print(next(g))
  45. l1 = [1,2,3,4]
  46. tu1 = ('a','b','c')
  47. tu2 = ('a1','b1','c1')
  48. g1 = zip(l1,tu1,tu2) # 也可以多个元素组合
  49. for i in g1:
  50. print(i)
  51. print("------------- 6 -----------------")
  52. # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,
  53. # 一般用在 for 循环当中。
  54. l1 = ['a','b','c','d']
  55. for index,i in enumerate(l1):
  56. print(index,i)
  57. print("------------- 7 -----------------")
  58. # abs() 函数返回数字的绝对值
  59. print(abs(-1))
  60. print(abs(1))
  61. print("------------- 8 -----------------")
  62. # all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。
  63. # 元素除了是 0、空、FALSE 外都算 TRUE
  64. print( all('a') )
  65. print( all([1,2,3,'',5,]) )
  66. print("------------- 9 -----------------")
  67. # any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。
  68. # 元素除了是 0、空、FALSE 外都算 TRUE
  69. print( any(['',0,False]) )
  70. print( any([1,0,False]) )
  71. print("------------- 10 -----------------")
  72. # bin() 返回一个整数 int 或者长整数 long int 的二进制表示 只能是数字
  73. print(bin(100))
  74. print("------------- 11 -----------------")
  75. # bool() 函数用于将给定参数转换为布尔类型,如果没有参数,返回 False
  76. print( bool(0) )
  77. print( bool(1) )
  78. print( bool('') )
  79. print("------------- 12 -----------------")
  80. # callable() 函数用于检查一个对象是否是可调用的。如果返回 True,object 仍然可能调用失败;
  81. # 但如果返回 False,调用对象 object 绝对不会成功
  82. print( callable(0) )
  83. a = 1
  84. print( callable(a) )
  85. def f():
  86. pass
  87. print( callable(f) )
  88. print("------------- 13 -----------------")
  89. # chr() 用一个整数作参数,返回一个对应的字符 。对应的ascii码 。可以用于验证码
  90. print( chr(97) )
  91. print("------------- 14 -----------------")
  92. # compile() 函数将一个字符串编译为字节代码。 慎用
  93. s1 = "for i in range(10):print(i)"
  94. f = compile(s1,'','exec')
  95. exec(f)
  96. print("------------- 15 -----------------")
  97. # dict() 函数用于创建一个字典
  98. # dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表
  99. # 带参数时,返回参数的属性、方法列表
  100. print(dir())
  101. print(dir(str))
  102. print("------------- 16 -----------------")
  103. # divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)
  104. print( divmod(7,3) )
  105. print("------------- 17 -----------------")
  106. # eval() 函数用来执行一个字符串表达式,并返回表达式的值。
  107. print( eval("3*7") )
  108. print("------------- 18 -----------------")
  109. # exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码。
  110. exec( 'print("hello world")' )
  111. print("------------- 19 -----------------")
  112. # filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换
  113. # 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,
  114. # 然后返回 True 或 False,最后将返回 True 的元素放到新列表中
  115. l1 = [1,2,3,4,5,6,7,8,9,10,]
  116. # def is_odd(n):
  117. # return n % 2 == 1
  118. g = filter(lambda x:x%2==1, l1)
  119. for i in g:
  120. print(i)
  121. print("------------- 20 -----------------")
  122. # float() 函数用于将整数和字符串转换成浮点数
  123. print( float(1) )
  124. print( float("100") )
  125. print("------------- 21 -----------------")
  126. # format() 格式化输出函数
  127. # frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素
  128. a = frozenset(range(10))
  129. print(a)
  130. print("------------- 22 -----------------")
  131. # globals() 函数会以字典类型返回全部全局变量
  132. def f():
  133. name = 'tom'
  134. print("1", globals())
  135. print("2", globals())
  136. f()
  137. print("------------- 23 -----------------")
  138. # hash() 用于获取取一个对象(字符串或者数值等)的哈希值
  139. print(hash('abc1'))
  140. print("------------- 24 -----------------")
  141. # help() 函数用于查看函数或模块用途的详细说明
  142. print(help('sys'))
  143. print(help('str'))
  144. print("------------- 25 -----------------")
  145. # hex() 函数用于将一个指定数字转换为 16 进制数
  146. print( hex(10) )
  147. print("------------- 26 -----------------")
  148. # id() 函数用于获取对象的内存地址
  149. s = 'a'
  150. print( id(s) )
  151. print("------------- 27 -----------------")
  152. # input() 函数接受一个标准输入数据,返回为 string 类型
  153. # int() 函数用于将一个字符串或数字转换为整型
  154. print( int("10") )
  155. print( int(10.1) )
  156. print("------------- 28 -----------------")
  157. # isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()
  158. a = 2
  159. print( isinstance(a,int) )
  160. s = 'alnk'
  161. print( isinstance(s, str))
  162. print("------------- 29 -----------------")
  163. # iter() 函数用来生成迭代器
  164. l1 = [1,2,3,4,]
  165. print(type(l1))
  166. g1 = iter(l1)
  167. print(type(g1))
  168. print("------------- 30 -----------------")
  169. # len() 方法返回对象(字符、列表、元组等)长度或项目个数
  170. print( len('abc'))
  171. print("------------- 31 -----------------")
  172. # list() 方法用于将 元组或字符串或迭代器 转换为列表
  173. t1 = (1,2,3,)
  174. print( list(t1))
  175. s1 = "abcd"
  176. print(list(s1))
  177. g1 = (i for i in range(1,10))
  178. print(type(g1))
  179. print(list(g1))
  180. print("------------- 32 -----------------")
  181. # locals() 函数会以字典类型返回当前位置的全部局部变量
  182. name = 'alnk'
  183. def f():
  184. age = 12
  185. print(locals())
  186. f()
  187. print(locals())
  188. print("------------- 33 -----------------")
  189. # map() 会根据提供的函数对指定序列做映射
  190. def squ(x):
  191. return x ** 2
  192. l1 = [1,2,3,4,5]
  193. # g = map(squ,l1)
  194. g = map(lambda x:x**2,l1)
  195. print(type(g)) # <class 'map'>
  196. for i in g:
  197. print(i)
  198. print("------------- 34 -----------------")
  199. # next() 返回迭代器的下一个项目
  200. # oct() 函数将一个整数转换成8进制字符串
  201. print( oct(10))
  202. print("------------- 35 -----------------")
  203. # open() 方法用于打开一个文件,并返回文件对象
  204. # ord() 函数是 chr() 函数(对于 8 位的 ASCII 字符串)的配对函数,
  205. # 它以一个字符串(Unicode 字符)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值
  206. print( ord('a'))
  207. print( chr(97))
  208. print("------------- 36 -----------------")
  209. # pow() 方法返回 xy(x的y次方) 的值。
  210. print( pow(2,3))
  211. print("------------- 37 -----------------")
  212. # print() 方法用于打印输出,最常见的一个函数
  213. print('abcd',end='|')
  214. print(1234)
  215. print('ABCD',end='')
  216. print('efgh')
  217. print("------------- 38 -----------------")
  218. # range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表
  219. # repr() 函数将对象转化为供解释器读取的形式
  220. s = "abcd"
  221. print( repr(s))
  222. dic = {'runoob': 'runoob.com', 'google': 'google.com'}
  223. print(repr(dic))
  224. print("------------- 39 -----------------")
  225. # round() 方法返回浮点数x的四舍五入值
  226. print( round(70.23456, 4))
  227. print( round(70.23456, 0))
  228. print( round(70.23456))
  229. print("------------- 40 -----------------")
  230. # set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等
  231. l = [1,1,2,2,3,3]
  232. s = set(l)
  233. print(s)
  234. print("------------- 41 -----------------")
  235. # str() 函数将对象转化为适于人阅读的形式
  236. f = 3.14
  237. s = str(f)
  238. print(type(f))
  239. print(s, type(s))
  240. print("------------- 42 -----------------")
  241. # tuple 函数将列表转换为元组
  242. l = [1,2,3]
  243. t = tuple(l)
  244. print(type(t))
  245. print("------------- 43 -----------------")
  246. # type() 函数如果你只有第一个参数则返回对象的类型
  247. a = 1
  248. print(type(a))
  249. print("------------- 44 -----------------")
  250. # 和类相关的内置函数
  251. # classmethod() 学习类以后再来补充
  252. # delattr() 学习类以后再来补充
  253. # getattr() 学习类以后再来补充
  254. # hasattr() 学习类以后再来补充
  255. # issubclass() 学习类以后再来补充
  256. # property() 学习类以后再来补充
  257. # setattr() 学习类以后再来补充
  258. # staticmethod() 学习类以后再来补充
  259. # super() 学习类以后再来补充

练习1

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. # 1、整理装饰器的形成过程,背诵装饰器的固定格式
  4. # 形成过程
  5. # 第一版:写一个功能测试其他同事的函数执行效率
  6. # 第二版:函数实现这个功能
  7. # 第三版:在不改变函数的执行方式下,同时测试执行效率
  8. # 第四版:装饰器雏形
  9. # 第五版:装饰器雏形的优化,语法糖@
  10. # 其他:被装饰函数带有参数
  11. # 其他:被装饰的函数要有返回值
  12. # 固定格式
  13. def wrapper(func):
  14. def inner(*args, **kwargs):
  15. """执行被装饰函数之前的操作"""
  16. ret = func(*args, **kwargs)
  17. """执行被装饰函数之后的操作"""
  18. return ret
  19. return inner
  20. print("------------- 1 ------------------")
  21. # 2、编写装饰器,在每次执行被装饰函数之前打印一句 '每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码'
  22. def wrapper(func):
  23. def inner(*args, **kwargs):
  24. print('每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码')
  25. result = func(*args, **kwargs)
  26. return result
  27. return inner
  28. @wrapper
  29. def f1(a):
  30. print('in f1 参数[%s]' % a )
  31. f1(1111111)
  32. print("------------- 2 ------------------")
  33. # 3、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数
  34. def auth(func):
  35. def inner(*args,**kwargs):
  36. count = 0
  37. while count < 3:
  38. username = input("请输入用户名>>>:").strip()
  39. password = input("请输入密码>>>:").strip()
  40. if username == "alnk" and password == "123":
  41. print('登陆成功!\n')
  42. result = func(*args, **kwargs)
  43. return result
  44. else:
  45. print("账号或者密码错误!")
  46. count += 1
  47. return inner
  48. @auth
  49. def func1():
  50. print('恭喜访问func1函数')
  51. func1()
  52. print("------------- 3 ------------------")
  53. # 4、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),
  54. # 要求登录成功一次,后续的函数都无需再输入用户名和密码
  55. flag = False
  56. count = 0
  57. def auth(func):
  58. def inner(*args,**kwargs):
  59. with open('user_info', encoding='utf-8', mode='r') as f:
  60. user_list = f.readline().strip().split('|')
  61. # 文件存储的账号密码
  62. name = user_list[0]
  63. pwd = user_list[1]
  64. global count
  65. while count < 3:
  66. username = input("请输入用户名>>>:").strip()
  67. password = input("请输入密码>>>:").strip()
  68. if username == name and password == pwd:
  69. print('登陆成功!')
  70. global flag
  71. flag = True
  72. count = 3 # 登录成功一次以后,后续就不需要在登录,不再进入while循环
  73. break
  74. else:
  75. print('账号或者密码错误')
  76. count += 1
  77. if flag:
  78. ret = func(*args,**kwargs)
  79. return ret
  80. return inner
  81. @auth
  82. def f1():
  83. print('in f1 ')
  84. @auth
  85. def f2():
  86. print('in f2 ')
  87. @auth
  88. def f3():
  89. print('in f3 ')
  90. f1()
  91. f2()
  92. f3()
  93. print("------------- 4 ------------------")
  94. # 5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,可支持多账号密码),
  95. # 要求登录成功一次(给三次机会),后续的函数都无需再输入用户名和密码。
  96. import os
  97. flag = False
  98. def login():
  99. username = input("请输入用户名>>>:").strip()
  100. password = input("请输入密码>>>:").strip()
  101. if os.path.exists('user/%s' % username): # 判断是否存在以用户名命名的文件
  102. with open('user/%s' % username,encoding='utf-8',mode='r') as f:
  103. user_list = f.readline().strip().split('|')
  104. name = user_list[0]
  105. pwd = user_list[1]
  106. if username == name and password == pwd:
  107. print('登陆成功!')
  108. global flag
  109. flag = True
  110. else:
  111. print('账号或者密码错误')
  112. else:
  113. print('账号或者密码错误')
  114. def auth(func):
  115. def inner(*args,**kwargs):
  116. count = 0
  117. while count < 3:
  118. if flag:
  119. ret = func(*args,**kwargs)
  120. return ret
  121. else:
  122. login()
  123. count += 1
  124. return inner
  125. @auth
  126. def f1():
  127. print('in f1 ')
  128. @auth
  129. def f2():
  130. print('in f2 ')
  131. @auth
  132. def f3():
  133. print('in f3 ')
  134. f1()
  135. f2()
  136. f3()
  137. print("------------- 5 ------------------")
  138. # 6、给每个函数写一个记录日志的功能,
  139. # 功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中
  140. # 所需模块:
  141. # import time
  142. # struct_time = time.localtime()
  143. # print(time.strftime("%Y‐%m‐%d %H:%M:%S",struct_time))
  144. #
  145. import time
  146. def write_log(func_name,time_node):
  147. with open('log.txt',encoding='utf-8',mode='a') as f:
  148. f.write("函数名:[%s] 时间:[%s]\n" % (func_name,time_node) )
  149. def wrapper(func):
  150. def inner(*args,**kwargs):
  151. # 获取时间戳
  152. struct_time = time.localtime()
  153. time_node = time.strftime("%Y-%m-%d %H:%M:%S",struct_time)
  154. # 获取被装饰的函数名
  155. func_name = func.__name__
  156. # 调用日志函数
  157. write_log(func_name,time_node)
  158. res = func(*args,**kwargs)
  159. return res
  160. return inner
  161. @wrapper
  162. def f1():
  163. time.sleep(4)
  164. print('in f1')
  165. @wrapper
  166. def f2():
  167. time.sleep(10)
  168. print('in f2')
  169. @wrapper
  170. def f3():
  171. time.sleep(5)
  172. print('in f3')
  173. f1()
  174. f2()
  175. f3()

练习2

  1. #!/usr/bin/env python3
  2. # author:Alnk(李成果)
  3. """
  4. 需求:
  5. 1),启动程序,首页面应该显示成如下格式:
  6. 欢迎来到博客园首页
  7. 1:请登录
  8. 2:请注册
  9. 3:文章页面
  10. 4:日记页面
  11. 5:评论页面
  12. 6:收藏页面
  13. 7:注销
  14. 8:退出程序
  15. 2),用户输入选项,3~6选项必须在用户登录成功之后,才能访问成功
  16. 3),用户选择登录,用户名密码从register文件中读取验证,三次机会, 没成功则结束整个程序运行,成功之后,可以选择访问3~6项,
  17. 访问页面之前, 必须要在log文件中打印日志,日志格式为-->用户:xx 在xx年xx月xx日 执行了 %s函数,
  18. 访问页面时,页面内容为:欢迎xx用户访问评论(文章,日记,收藏)页面
  19. 4),如果用户没有注册,则可以选择注册,注册成功之后,可以自动完成登录,然后进入首页选择。
  20. 5),注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。
  21. """
  22. import datetime
  23. # 标志位
  24. flag = False
  25. # 用户名
  26. user_name = None
  27. def r_w_register(*args, mode='r'):
  28. """
  29. 注册、获取用户账号密码信息
  30. :param args: 注册时,接收用户名和密码
  31. :param mode: 默认r 模式读取,a 模式注册
  32. :return: r模式返回用户信息字典{"name":"password",} a模式返回True
  33. """
  34. if mode == 'r':
  35. user_dic = {}
  36. with open('register', encoding='utf-8', mode='r') as f:
  37. for line in f:
  38. l1 = line.strip().split('|')
  39. user_dic[l1[0]] = l1[1]
  40. return user_dic
  41. elif mode == 'a':
  42. if args:
  43. # 获取参数传递过来的需要注册的账号和密码
  44. user_name = args[0]
  45. user_pwd = args[1]
  46. # 获取已经注册的用户信息
  47. user_dic = r_w_register(mode='r')
  48. # 判断账号是否已经注册
  49. if not user_dic.get(user_name):
  50. with open('register', encoding='utf-8', mode='a') as f:
  51. f.write('%s|%s\n' % (user_name,user_pwd) )
  52. f.flush()
  53. return True
  54. else:
  55. print('[%s] 用户已经被注册了哦!\n' % user_name )
  56. else:
  57. print('请输入用户名和密码哦!\n')
  58. else:
  59. return '参数有误!\n'
  60. def login():
  61. """登录"""
  62. # 获取用户帐号密码信息
  63. user_dic = r_w_register(mode='r')
  64. # 密码输错3次退出程序
  65. count = 0
  66. while count < 3:
  67. global user_name
  68. user_name = input('请输入账号>>>:')
  69. user_pwd = input('请输入密码>>>:')
  70. # 判断账号密码是否正确
  71. if user_dic.get(user_name) and user_dic[user_name] == user_pwd:
  72. print('恭喜,登录成功!\n')
  73. global flag
  74. flag = True
  75. break
  76. else:
  77. print('账号或者密码错误!\n')
  78. count += 1
  79. if count == 3:
  80. exit('密码错误次数过多,程序结束运行!')
  81. def auth(func):
  82. """装饰器"""
  83. def inner(*args,**kwargs):
  84. while 1:
  85. if flag:
  86. # 日志记录
  87. func_name = func.__name__
  88. write_log(user_name, func_name)
  89. res = func(*args,**kwargs)
  90. return res
  91. else:
  92. login()
  93. return inner
  94. def register():
  95. """注册"""
  96. global user_name
  97. user_name = input('请输入你要注册的账号>>>:')
  98. user_pwd = input('请输入你要注册的密码>>>:')
  99. # 注册时账号密码不能为空
  100. if len(user_name) == 0 or len(user_pwd) == 0:
  101. print('用户名和密码不能为空!\n')
  102. else:
  103. # 调用函数注册,获取返回值
  104. ret = r_w_register(user_name, user_pwd, mode='a')
  105. # 判断注册是否成功
  106. if ret:
  107. global flag
  108. flag = True
  109. print('[%s] 用户注册成功!\n' % user_name )
  110. else:
  111. print('注册失败!\n')
  112. def write_log(user_name, func_name):
  113. """日志记录"""
  114. # 获取当前时间
  115. time = datetime.datetime.now()
  116. year = time.year
  117. month = time.month
  118. day = time.day
  119. content = "用户:[%s] 在 %s 年 %s 月 %s 日,执行了 [%s] 函数\n" % (user_name, year, month, day, func_name)
  120. # 记录日志
  121. with open('log', encoding='utf-8', mode='a') as f:
  122. f.write(content)
  123. f.flush()
  124. @auth
  125. def article():
  126. """文章页面"""
  127. print('欢迎 [%s] 用户访问文章页面\n' % user_name)
  128. @auth
  129. def diary():
  130. """日记页面"""
  131. print('欢迎 [%s] 用户访问日记页面\n' % user_name )
  132. @auth
  133. def comment():
  134. """评论页面"""
  135. print('欢迎 [%s] 用户访问评论页面\n' % user_name)
  136. @auth
  137. def colle():
  138. """收藏页面"""
  139. print('欢迎 [%s] 用户访问收藏页面\n' % user_name )
  140. def log_out():
  141. """注销"""
  142. if user_name:
  143. global flag
  144. flag = False
  145. print('[%s] 账号注销成功!\n' % user_name )
  146. else:
  147. print('您没有登录哦,不用注销!\n')
  148. def sign_out():
  149. """退出"""
  150. exit('退出程序!\n')
  151. def view():
  152. """显示"""
  153. msg = '''------ 欢迎来到博客园首页 ------
  154. 1:请登录
  155. 2:请注册
  156. 3:文章页面
  157. 4:日记页面
  158. 5:评论页面
  159. 6:收藏页面
  160. 7:注销
  161. 8:退出程序
  162. '''
  163. dic = {
  164. '1':login,
  165. '2':register,
  166. '3':article,
  167. '4':diary,
  168. '5':comment,
  169. '6':colle,
  170. '7':log_out,
  171. '8':sign_out,
  172. }
  173. while 1:
  174. print(msg)
  175. choice = input('请输入编号>>>:')
  176. if dic.get(choice):
  177. dic[choice]()
  178. else:
  179. print('请输入正确的标号哟\n')
  180. if __name__ == '__main__':
  181. view()

Python语言系列-04-高阶函数的更多相关文章

  1. 【python】python函数式编程、高阶函数

    1.map() : python内置的高阶函数,接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上,得到一个新的list并            返回. def f(x): r ...

  2. python 函数式编程:高阶函数,map/reduce

    python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...

  3. python入门16 递归函数 高阶函数

    递归函数:函数内部调用自身.(要注意跳出条件,否则会死循环) 高阶函数:函数的参数包含函数 递归函数 #coding:utf-8 #/usr/bin/python """ ...

  4. python内置常用高阶函数(列出了5个常用的)

    原文使用的是python2,现修改为python3,全部都实际输出过,可以运行. 引用自:http://www.cnblogs.com/duyaya/p/8562898.html https://bl ...

  5. python函数式编程之高阶函数学习

    基本概念 函数式编程,是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量.因此,任意一个函数,只要输入确定,输出就确定的这种函数我们称之为纯函数,我们称这种函数没有副作用.而允许使用 ...

  6. 【python】-- 递归函数、高阶函数、嵌套函数、匿名函数

    递归函数 在函数内部,可以调用其他函数.但是在一个函数在内部调用自身,这个函数被称为递归函数 def calc(n): print(n) if int(n/2) == 0: #结束符 return n ...

  7. Python之路 day3 高阶函数

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa """ 变量可以指向函数,函数的参数能接收变量, 那么 ...

  8. Python 编程基础之高阶函数篇(一)

      高阶函数:能接受函数作为参数的函数. 如: f=abs def   add(x,y,f): return f(x)+f(y) 如果我们用:add(-5,9,f)来调用该高阶函数,则返回结果为:14 ...

  9. python高级特性和高阶函数

    python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...

  10. python进阶学习之高阶函数

    高阶函数就是把函数当做参数传递的一种函数, 例如: 执行结果: 1.map()函数 map()接收一个函数 f 和一个list, 并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 l ...

随机推荐

  1. 暑假自学java第一天

    今天通过网上的学习资料安装了Java的环境和java的程序开发工具包(JDK) 还安装了eclipse ,英语不太好,所以不太会用这个软件,网上搜了教程,还是出现了问题:unnamed package ...

  2. Spring:Spring-AOP简介

    什么是SpringAOP? 将一些相关的编程方法,独立提取出来,独立实现,然后动态地将代码切入到类的指定方法.指定位置上的编程方式就是AOP(面向切面编程). 讲解一下AOP中的相关概念 Aspect ...

  3. SpringMVC(6)数据验证

    在系列SpringMVC(4)数据绑定-1.SpringMVC(5)数据绑定-2中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容 -> 数据验证. ...

  4. 用swoole实现异步任务队列

    应用场景如下: 假如要发100封邮件,for循环100遍,这种方法显然是不可取的. 在一些比较繁杂的业务里,我们很可能有超过1万的邮件要群发.那我们怎么处理这个延迟的问题? 答案就是用异步.把&quo ...

  5. 你会用哪些JavaScript循环遍历

    总结JavaScript中的循环遍历定义一个数组和对象 const arr = ['a', 'b', 'c', 'd', 'e', 'f']; const obj = { a: 1, b: 2, c: ...

  6. 分享一份550多个Linux命令的文档,按照命令首字母索引排序

    输入一个命令,让我给你一个关于它的完美解释! 众所周知,Linux命令是IT人必须掌握的一个技能,有了它,我们可以部署和维护各种各样的服务和应用.但是,大部分的Linux命令我们不一定记得住,而别是各 ...

  7. C语言:最大公约数

    //求最大公约数 #include <stdio.h> main() { int m,n,i,k; scanf("%d,%d",&m,&n); k=m& ...

  8. urllib库中的URL编码解码和GETPOST请求

    在urllib库的使用过程中,会在请求发送之前按照发送请求的方式进行编码处理,来使得传递的参数更加的安全,也更加符合模拟浏览器发送请求的形式.这就需要用urllib中的parse模块.parse的使用 ...

  9. Vue中Object和Array数据变化侦测原理

    在学完Vue.js框架,完成了一个SPA项目后,一直想抽时间找本讲解Vue.js内部实现原理的书来看看,经过多方打听之后,我最后选择了<深入浅出Vue.js>这本书.然而惭愧的是,这本书已 ...

  10. c# 将checkedListBox选择的值保存再数组中并转换成以指定字符连接的字符串

    经常忘记,所以记一下: string[] arr =new string[3]; int b = 0; foreach (string outstr in checkedListBox1.Checke ...