设为首页 收藏本站
查看: 1942|回复: 0

[经验分享] python基础4-12764272

[复制链接]

尚未签到

发表于 2018-8-10 12:14:03 | 显示全部楼层 |阅读模式
  python基础4
  高阶函数
  一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
  sorted函数
  排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。通常规定如下,实现从小到大的排序:
  x < y, return -1
  x == y, return 0
  x > y, return 1
  In [1]: t = (12,34,1,24,37)
  In [2]: sorted(t)
  Out[2]: [1, 12, 24, 34, 37]
  In [4]: def reversed_cmp(x,y):###想要实现倒序,则需定义一个函数###
  ...:     if x>y :
  ...:         return -1
  ...:     elif x<y:
  ...:         return 1
  ...:     else:
  ...:         return 0
  ...:
  In [5]: sorted(t,reversed_cmp)
  Out[5]: [37, 34, 24, 12, 1]
  In [6]: li = ['westos','redhat','linux']
  In [7]: sorted(li)
  Out[7]: ['linux', 'redhat', 'westos']###按字母的ASCII码的顺序
  In [8]: li = ['linux','Redhat','westos']
  In [9]: sorted(li)
  Out[9]: ['Redhat', 'linux', 'westos']
  In [10]: li = ['linux','Redhat','westos','redhat']
  In [11]: sorted(li)
  Out[11]: ['Redhat', 'linux', 'redhat', 'westos']
  In [13]: def ignore_case_cmp(x,y):###既有大写,又有小写时,定义一个函数,忽略大小写####
  ....:     lower1 = x.lower()
  ....:     lower2 = y.lower()
  ....:     if lower1 < lower2 :
  ....:         return -1
  ....:     elif lower1 > lower2:
  ....:         return 1
  ....:     else:
  ....:         return 0
  ....:
  In [14]: sorted(li,ignore_case_cmp)
  Out[14]: ['linux', 'Redhat', 'redhat', 'westos']
  #函数作为返回值()
  def wrap_sum(*args):
  def my_sum():
  sum_num = 0
  for i in args:
  if not isinstance(i,(int,float)):
  print "Error Type"
  sum_num = sum_num +i
  return sum_num###返回的函数名不加括号,就返回该函数的地址###
  return my_sum
  f = wrap_sum(1,2,3,6)
  #print f
  print f()###要想调该函数的值,则需要加括号####
  f1 = wrap_sum(1,2,3,6)###传递的参数一样,但是函数地址是不一样的,每次调用都是调用一个新函数####
  print f1
  f2 = wrap_sum(1,2,3,6)
  print f2
  执行结果:
  /usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/15.py
  12
  <function my_sum at 0x8f0a28>
  <function my_sum at 0x8f0aa0>
  Process finished with exit code 0
  def count():
  fs = []
  for i in range(1,4):
  def  f():
  return i*i
  fs.append(f)###将f的地址加入列表fs###
  return fs###返回的是三个地址###
  f1,f2,f3 = count()###调用count()函数,即将返回的三个地址分别给了f1,f2,f3###
  print f1()
  print f2()
  print f3()
  ###但是执行结果均为9###
  改进:
  def count():
  fs = []
  for i in range(1,4):
  def f(j):
  def g():
  return j*j
  return g
  fs.append(f(i))
  return fs
  f1,f2,f3 = count()
  print f1()
  print f2()
  print f3()
  执行结果:
  1
  4
  9
  ####匿名函数###
  当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
  关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数,冒号后表示要返回的值
  1 匿名函数不需要函数名,可以避免函数名的冲突
  2 匿名函数可以跳过给函数分配栈空间
  def pow1(x):
  return x*x
  print map(pow1,range(1,11))
  print map(lambda x:x*x,range(1,11))
  执行结果:
  /usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/15.py
  [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
  Process finished with exit code 0
  3 匿名函数可以赋值给一个变量,需要运行时,变量名()
  print lambda :1###打印了匿名函数的地址###
  f = lambda :1###将地址赋值给变量##
  print f()###运行结果###
  执行结果:
  <function <lambda> at 0x13059b0>
  1
  ###匿名函数传递必选参数和默认参数###
  f = lambda x,y=2:x**y
  print f(2,3)
  print f(2)
  执行结果:
  /usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/15.py
  8
  4
  Process finished with exit code 0
  ###匿名函数传递可变参数###
  f = lambda *x:map(lambda x:x*x,x)
  print f(1,2,3,4)
  执行结果:
  /usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/15.py
  [1, 4, 9, 16]
  Process finished with exit code 0
  ###匿名函数传递关键字参数###
  f = lambda **kwargs:kwargs.items()
  print f(name="fentiao",age=5)
  执行结果:
  /usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/15.py
  [('age', 5), ('name', 'fentiao')]
  Process finished with exit code 0
  练习:利用匿名函数和字典重新编辑计算器的代码
  x =input("num1:")
  oper = raw_input("oper:")
  y = input("num2:")
  d ={
  "+":lambda x,y:x+y,
  "-":lambda x,y:x-y,
  "*":lambda x,y:x*y,
  "/":lambda x,y:x/y
  }
  if oper not in d.keys():
  print "Error"
  print d[oper](x,y)
  执行结果:
  /usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/15.py
  num1:3
  oper:+
  num2:4
  7
  Process finished with exit code 0
  In [2]: print 1 if 1>2 else 2###判断1是否大与2,若大与则返回1,小与则返回2
  2
  ####装饰器####
  用来装饰函数的函数
  1 不修改函数的源代码
  2 函数的调用方式没有改变
  ###准备###
  def hello():
  print "hello..."
  hello1()
  def hello1():
  print "hello1..."
  hello()
  ####计算程序执行时间###
  import time###导入模块###
  def timmer(func):
  start_time = time.time()
  func()
  stop_time = time.time()
  return stop_time-start_time
  def hello2():
  print "hello2..."
  time.sleep(2)###停2s###
  print timmer(hello2)
  ###不改变调用方式###
  import time
  def timmer(func):
  def dec():
  start_time = time.time()
  func()
  stop_time = time.time()
  return stop_time-start_time
  return dec
  def hello2():
  print "hello2..."
  time.sleep(2)
  hello2=timmer(hello2)
  hello2()
  执行结果:
  /usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/15.py
  hello2...
  Process finished with exit code 0
  ###装饰器###
  import time
  def timmer(func):
  def dec():
  start_time = time.time()
  func()
  stop_time = time.time()
  return stop_time-start_time
  return dec
  @timmer     ###相当于hello2=timmer(hello2),语法糖###
  def hello2():
  print "hello2..."
  time.sleep(2)
  print hello2()
  执行结果:
  /usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/15.py
  hello2...
  2.00218486786
  Process finished with exit code 0
  ###写一个装饰器实现hello2()函数的日志,日志内容为hello()的内容以及执行时间###
  import time
  def timmer(func):
  def dec():
  start_time = time.time()
  func()
  stop_time = time.time()
  return "%s run %f s"%(func.__name__,stop_time-start_time)
  return dec
  @timmer     ###hello2=timmer(hello2),语法糖
  def hello2():
  print "hello2..."
  time.sleep(2)
  print hello2()
  执行结果:
  /usr/bin/python2.7 /home/kiosk/PycharmProjects/pythonbasic/15.py
  hello2...
  hello2 run 2.002128 s
  Process finished with exit code 0
  ###对文件进行操作###
  f = open("hello")###打开文件###
  print f.read()###读文件###
  f.close()###关闭文件###
  f = open("hello",'w')###以写方式打开,此时不能进行读操作###
  f.write("python")###会将文件内容覆盖为”python“
  f.close()###关闭文件###
  执行结果:
  其他的几种模式:
  r:可以读取文件内容,不可以写入,如果文件不存在则报错
  In [4]: f = open("/home/kiosk/PycharmProjects/pythonbasic/hello","r")
  In [5]: f.read()
  Out[5]: 'python'
  In [6]: f.write
  f.write       f.writelines
  In [6]: f.write("linux")###不可以写入###
  ---------------------------------------------------------------------------
  IOError                                   Traceback (most recent call last)
  <ipython-input-6-18e05364d061> in <module>()
  ----> 1 f.write("linux")
  IOError: File not open for writing
  In [7]: f.write("linux")
  r+:读写模式,依次覆盖源文件内容,写多少覆盖多少,如果文件不存在则报错
  In [1]: f = open("hello","r+")
  In [2]: f.read()
  Out[2]: 'python'
  In [3]: f.close()
  In [4]: f = open("hello","r+")
  In [5]: f.write("westos")
  In [6]: f.read()###此时读的是在覆盖后的下一个位置,因此要想读取该文件,则需要先关闭文件,再打开###
  Out[6]: ''
  In [7]: f.close()
  In [9]: f = open("hello","r+")
  In [10]: f.read()
  Out[10]: 'westos'
  w:可以写入文件内容,不可以读取,如果文件不存在则创建
  In [12]: f = open("lllll","w")
  [kiosk@foundation38 pythonbasic]$ ls
  10.py  12.py  14.py  1.py  3.py  5.py  7.py  9.py               hello  stack.py
  11.py  13.py  15.py  2.py  4.py  6.py  8.py  file_operation.py  lllll
  w+:可读写,打开文件使直接删除源文件内容,如果文件不存在则创建
  In [13]: f = open('hello','w+')
  In [14]: f.read()
  Out[14]: ''
  In [17]: f.write("world")
  In [18]: f.read()
  Out[18]: ''
  In [19]: f.close()
  In [20]: f = open('hello')
  In [21]: f.read()
  Out[21]: 'world'
  a:写入,文件末尾追加,不可以读,文件不存在则创建
  In [22]: f = open('hello','a')
  In [23]: f.write("hello,hello")
  In [25]: f.close()
  In [27]: f = open('hello')
  In [28]: f.read()
  Out[28]: 'worldhello,hello'
  a+:读写,文件追加,文件不存在则创建
  ###指定读取几个字节###
  In [36]: f = open("hello")
  In [37]: f.read(4)###读取4个字节###
  Out[37]: 'worl'
  ###一行一行的读取###
  In [40]: f = open("hello")
  In [41]: f.readlin
  f.readline   f.readlines
  In [41]: f.readline()
  Out[41]: 'worldhello,hello'
  In [42]: f.readline()
  Out[42]: ''

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-549654-1-1.html 上篇帖子: Python 变量类型 下篇帖子: python基础2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表