高阶函数:

  

  1. def f(n):
  2. return n*n
  3. def foo(a,b,func):
  4. func(a)+func(b)
  5. ret=func(a)+func(b)
  6. return ret
  7. foo(1,2,f) #f是函数foo的实参,func是函数foo的形参,因为f为函数名,所以就是变量,将地址传给了func
  8. print(foo(1,2,f)) #输出的是函数的返回值5

2

  1. +2

2

  1. =5

注意函数加括号才是调用,不加括号的时候只是一个函数名。

函数本身是一个对象,函数名是变量

所以:1、函数名可以进行赋值

   2、函数名可以作为函数参数,还可以作为函数的返回值

高阶函数的条件:

  1、函数名可以作为参数输入

  2、函数名可以作为返回值

递归函数

通过递归函数可实现阶乘

  1. def fact(n):
  2. if n==1:
  3. return 1
  4. return n*fact(n-1)
  5. print(fact(5))
    递归的特性:
      1、调用自身函数
      2、有一个结束条件
      3、效率低
    因为存在效率低,而且只要可以使用递归可以解决的,用循环都可以,所以一般都用循环做。

内置函数

重要的内置函数:

  filter    过滤

  str=["a","b","c","d"]

  def fun1(s):

    if s!="a":

      return s                    #filter的作用就是将字符串封装好,一个个送到fun1这个函数里面去

  ret=filter(fun1,str)                 #过滤完的就是一个迭代器了    迭代器就像哆啦A梦的口袋,用多少,拿多少,不占内存

  print(list(ret))                       #转成列表

>>>>>>["b","c","d"]

  map         在元素后面添加字符串

  str=["d","a","b"]

  def fun2(s):

    return s+"alvin"

  ret=map(fun2,str)                #map左边括号左边的是函数名

  print(ret)                               #输出的依旧是一个元组

  print(list(ret))

>>>>>>["dalvin","aalvin","balvin"]

  reduce

  from functools import reduce

  def add1(x,y):

    return x+y

  print(reduce(add1,range(1,10)))

>>>>>>45

因为reduce函数调用完成的只是一个值,所以不要迭代器,而map和filter则是一个序列,所以需要迭代器。

  lambda

  from functools import reduce

  print(reduce(lambda x,y:x*y,range(1,6)))     #实现的是阶乘,x+y也可以,所以代码比较少和方便

  >>>>>>120

装饰器(函数)

  1、作用域:L-E-G-B

  2、高阶函数

  3、闭包

  

  1. def outer(): #
  2. x=10 #
  3. def inner(): #inner就是内部函数 #3
  4. print(x) #外部环境的变量 #4
  5. return inner #内部函数inner就是一个闭包 #5
  6. #inner() #局部变量,全局无法调用
  7. f=outer() #
  8. f() #
  9. #代码执行的顺序是1-->6-->2-->3-->5-->7-->4 最后输出的是10
  10. #也许大家都会有这么一个疑问,就是在第6步执行完了之后就是到了return inner
  11. #之后再执行第7步的时候,其实外层的函数在到return inner的时候已经执行完了
  12. #第7步只是在执行print(x),那疑问就是为什么还能输出外层的x呢?
  13. # (外层的代码在6235时执行完了)。这种现象就叫闭包

所以闭包的定义:如果在一个内部函数里,对外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。

关于闭包:闭包=内部函数+引用外部环境的变量

装饰器:

  

  1. import time
  2. def bar():
  3. print("bar...")
  4. time.sleep(3)
  5. def foo():
  6. print("foo...")
  7. time.sleep(2)
  8. def showtime(f):#在括号里面加入函数名,就是变量
  9. start=time.time()
  10. f()
  11. end=time.time()
  12. print("spend:%s"%(end-start))
  13. showtime(foo)

再看一个代码:

  1. import time
  2. def bar():
  3. print("bar...")
  4. time.sleep(3)
  5. def foo():
  6. print("foo...")
  7. time.sleep(2)
  8. def showtime(f):#在括号里面加入函数名,就是变量
  9. def inner():
  10. start=time.time()
  11. f() #闭包
  12. end=time.time()
  13. print("spend:%s"%(end-start))
  14. return inner
  15. foo=showtime(foo) #showtime(foo)拿到的是inner的内存地址
  16. foo() #执行inner函数
  17. #其中foo=showtime(foo)等价于@showtime
  18. #代码还可以写成:
  19. import time
  20. def showtime(f):#在括号里面加入函数名,就是变量
  21. def inner():
  22. start=time.time()
  23. f() #闭包
  24. end=time.time()
  25. print("spend:%s"%(end-start))
  26. return inner
  27. @showtime
  28. def bar():
  29. print("bar...")
  30. time.sleep(3)
  31. @showtime
  32. def foo():
  33. print("foo...")
  34. time.sleep(2)
  35.  
  36. foo()

对于不定长的参数:功能函数加参数

  1. import time
  2. def showtime(f):#在括号里面加入函数名,就是变量
  3. def inner(*x,**y):
  4. start=time.time()
  5. f(*x,**y) #闭包
  6. end=time.time()
  7. print("spend:%s"%(end-start))
  8. return inner
  9. @showtime #@showtime之后然后代码往下找,是add函数需要showtime所以add函数的形参
  10. #也要赋给inner函数同理f函数也要调用,因为就是引用add函数的。
  11. def add(*x,**y): #@showtime就相当于把变量定位到了inner
  12. sum=0
  13. for i in x:
  14. sum+=i
  15. print(sum)
  16. @showtime
  17. def foo():
  18. print("foo...")
  19. time.sleep(2)

图的意思:foo()函数原本执行的时候是粉色的框框,但是有@showtime是,就要执行装饰器里面的内容

就是蓝色的框框,其中粉色框的函数也包含在蓝色的框里面了,所以图中执行的顺序就是上述这个样子。

考虑在装饰器上加参数:在套一层函数引入参数flag

  1. import time
  2. def logger(flag):
  3. def showtime(f):#在括号里面加入函数名,就是变量
  4. def inner(*x,**y):
  5. start=time.time()
  6. f(*x,**y) #闭包
  7. end=time.time()
  8. print("spend:%s"%(end-start))
  9. if flag=="true":
  10. print("日志记录")
  11. return inner
  12. return showtime
  13. @logger("true") #这行代码其实分为两部分,@是一部分,logger("true")是一部分。先执行的是logger(true)
  14. #@是看logger(true)返回回来的值,他返回回来的是showtime,所以原来的代码就相当于
  15. #@showtime 其实加logger()这个函数目的就是为了引用flag这个参数
  16. def add(*x,**y):
  17. sum=0
  18. for i in x:
  19. sum+=i
  20. print(sum)
  21. @logger("")
  22. def foo():
  23. print("foo...")
  24. time.sleep(2)
  25.  
  26. add(1,2,5,7)

装饰器的登录应用

  1. login_status=False
  2. def logger(flag):
  3. def login(f):
  4. def inner():
  5. global login_status
  6. if login_status == False:
  7. nameuser = input("input your name:> ")
  8. print (nameuser)
  9. passwd = input ("input your password: > ")
  10. print (passwd)
  11. if flag == "jingdong":
  12. # 打开文件
  13. with open("jingdong","r",encoding="utf8") as file_read:
  14. menu_dict=eval(file_read.read().strip())
  15. for i in menu_dict:
  16.  
  17. if nameuser ==i and passwd == menu_dict[i]:
  18. print ("welcome jingdong")
  19. login_status = True
  20. else:
  21. print("输入有误")
  22. break
  23. elif flag == "weixin":
  24. with open("weixin", "r", encoding="utf8") as file_read:
  25. menu_dict = eval(file_read.read().strip())
  26. for i in menu_dict:
  27.  
  28. if nameuser == i and passwd == menu_dict[i]:
  29. print("welcome jingdong")
  30. login_status = True
  31.  
  32. f()
  33. return inner
  34. return login
  35. @logger("jingdong")
  36. def home():
  37. print("welcome to homepage")
  38. @logger("weixin")
  39. def finance():
  40. print("welcome to finance")
  41. @logger("jingdong")
  42. def book():
  43. print("welcome to bookpage")
  44. with open("home_menu","r",encoding="utf8") as page_read:
  45. menu_dict=eval(page_read.read().strip())
  46. menu_dict_super=[]
  47. good_list=[]
  48. while True:
  49. for i,v in enumerate(menu_dict,1):
  50. print(i,">>>",v)
  51. user_choice = input('请输入选择:返回上一级[q]').strip()
  52. if user_choice in menu_dict:
  53. menu_dict_super.append(menu_dict)
  54. if user_choice=="home":
  55. home()
  56. elif user_choice=="finance":
  57. finance()
  58. elif user_choice=="book":
  59. book()
  60.  
  61. if type(menu_dict)==list:
  62. print("您选择的商品是:",user_choice)
  63. else:
  64. menu_dict=menu_dict[user_choice]
  65. good_list.append(user_choice)
  66. elif user_choice=="q":
  67. if menu_dict_super:
  68. menu_dict=menu_dict_super.pop()
  69. else:
  70. print("请输入正确的商品")

其中文档,比如jingdong中的就是{“mengheng”:“456”}

python语法之函数2的更多相关文章

  1. python语法之函数

    函数: 将特定功能代码编写在一个函数里 便于阅读和复用 对一组表达特定功能表达式的封装 使程序模块化 python内置函数: input(),print(),eval()... 函数定义 函数语法格式 ...

  2. python语法join函数

    Python语法中join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串. vid = )

  3. python语法基础-函数-内置函数和匿名函数-长期维护

    ##################     内置函数        #######################  """ 一共是 68个内置函数: 反射相关的内置函 ...

  4. python语法------时间函数

    1.导入函数库: import time 获取格式化的时间 你可以根据需求选取各种格式,但是最简单的获取可读的时间模式的函数是asctime(): #!/usr/bin/python # -*- co ...

  5. python语法_函数

    ---恢复内容开始--- 函数: 1 减少重复代码 2 定义一个功能,需要直接调用 3 保持代码一致性 def  funcation_name(参数s): 功能代码块0 参数可以为多个,传入时按照前后 ...

  6. python语法之函数1

    函数 计算机中的函数和数学中的函数不是一回事,而是一个subroutine .子程序.procedures.过程. 作用: 1.减少重复代码: 2.方便修改,更易扩展: 3.保持代码的一致性. 最简单 ...

  7. Python语法基础-函数,类以及调试处理

    [TOC] 1. 函数的定义 python中函数有两种: python自带的函数 用户定义函数 返回多个值 原来返回值是一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同 ...

  8. python语法基础-函数-装饰器-长期维护

    ######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...

  9. python语法基础-函数-进阶-长期维护

    ###############    函数的命名空间和作用域    ############## """ # 函数进阶 命名空间和作用域 命名空间 全局命名空间——我们自 ...

  10. Python语法之函数、引用和装饰器

    所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用 函数是带名字的代码块,用于完成具体的工作 需要在程序中多次执行同一项任务时,你无需反复编写完成该任务的代码,而只需调用该 任务 ...

随机推荐

  1. 云栖大会day1 上午

    参与云栖大会第一天感受 早晨参与内容 数据智能实践专场 议程是 09:00-09:25 互联网下半场用户增长之路 吕志国 [友盟+]CPO 09:25-09:50 数据开启智慧零售的升级引擎 刘延明 ...

  2. 最长公共前缀(python) leetcode答案

    直接上代码: def longestCommonPrefix(strs): """ :type strs: List[str] :rtype: str "&qu ...

  3. ArcGIS 要素类平移工具-arcgis案例实习教程

    ArcGIS 要素类平移工具-arcgis案例实习教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:对整个要素类,按指定偏移距离,进行整体平移. 优点:使用 ...

  4. JVM、redis缓存适用场景

    1. 数据状态相对稳定:(针对数据本身)数据修改较少. 2. 输出的数据是相对幂等:(针对业务)多次查询期间,数据不变动.如果查询频率过高,缓存可能没有及时更新. 了解一下redis.ehcache. ...

  5. R和Python,对抗or融合?

    来源商业新知网,原标题:从对抗到融合,教你充分利用R+Python! 我们应该将关注点放在技能上,而不是工具上. 如果你从事数据科学的工作,可能会立即想到两种编程语言:R和Python. 事实上,R和 ...

  6. # 2018-2019-20175302实验一《Java开发环境的熟悉》实验报告

    2018-2019-20175302实验一<Java开发环境的熟悉>实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java ...

  7. 第七周博客作业 <西北师范大学| 周安伟>

    第七周博客作业 助教博客链接:https://home.cnblogs.com/u/zaw-315/ 本周无评作业 查看了同学们提交的对实验四的附加实验项目互评.其中对博文结构,内容来评价是否符合作业 ...

  8. JMETER java.net.SocketException: Connection reset 报错解决方案

    相关值解析MaxUserPort:最大动态端口数(Default = 5000, Max = 65534)TcpTimedWaitDelay:TCP等待延迟时间(30)TcpNumConnection ...

  9. background-attachment: fixed 在iphone设备失效的解决

    下面为引用,源代码有点问题,自己修改了一下.先做记录,回头再细修. 引用部分,但代码有问题 http://www.ptbird.cn/css-background-attachment--fiexed ...

  10. jdk1.7/1.8 HashMap、ConcurrentHashMap详解

    摘要: 本文主要参考网上Blog(详见Reference)总结ConcurrentHashMap的各方面知识,方便复习 转自:https://my.oschina.net/hosee/blog/675 ...