• 三、函数


    函数封装

    def  函数名(参数):

      函数体

    以后就可以直接调用  函数名

    return返回的是对象

    return和yield的区别,前者硬性 遇到就返回, 后者跳出来 生成器

    函数参数

    语法 :func(positional args,keyword_args, *tuple_nonkw_args,**dict_kw_args)

                         位置                 关键字                 非关键字               关键字不定长

    传递方式:

    位置参数  要一一对应

    关键字参数  def foo1(x, y,intro=“教育”) 

          foo1(“教育机构”,“网址”)

    类似C++的默认构造函数

    def mysun(*args) #位置参数包裹以及使用*

      return args

    type(mysum(5, 6, 6))   #tuple

    传递参数不受限制

    def filmInfo2(**kwargs) #关键字包裹以及使用**

      print(type(kwargs))

      for key, value in kwargs.items():

        print(key, ':', value)

    filmInfo2(film='让子弹飞', box=7.5,rate =8.0,price = 60)

    #解包

    def scoreReport(name,age, *args, course = 'python', **kwargs):

      print('个人信息:', name, age)

      for item in args:

        print('--->'item)

      print('课程信息', course)

      print('每节课的成绩:')

      for key.value in kwargs.item():

        print('>>>',key, value)

      scoreReport('jace', 25, '高中部', '三年一班', 'xuoweihao:40', lesson = 85, lesson2=90)

    def filmInfo(**kwargs):

      print(type(kwargs))

      for key,values in kwargs.item():

        print(key, ':', values)

    dl =['film':'xiuxiude tiequan',box=6.5, prince=60, actor= ='shenteng']

    filmInfo(**dl)

    #题外话,字典形式的写法,如果遇到数字类型的时候怎么写

    dl ={'film':'xiuxiude tiequan','box':'6.5', 'prince':'60', 'actor':'shenteng'}

    filmInfo(**dl)

     ################################################################

    companyName='七月在线'

    def getCompany():

      url = 'http.julyedu.com'

      return companyName

    getCompany()

    越是内部的就越是能访问外部的,反之很难

    函数执行完之后就不存在了,除非下一次调用

    url='julyedu.org' # 全局

    def getUrl():

      url = 'http.julyedu.com' #局部

      return url

    getUrl()

    返回的是内部的

     ###################################################################

    偏函数PFA

    使用场景:如果一个函数的参数很多,而在每次调用的时候有一些又经常不需要指定的,

    就可以使用(偏函数相当于默认值)

    语法: partical(func, *args, **keywords)

      from functools import partial

    原理:创建一个新函数,固定住原函数的部分参数(可以为位置参数、关键字参数)

    例如,将16进制的字符串转化成十进制的

    def hex2int1(num):

      return (str(num),base = 16) #base为关键字参数这个在调用int函数时,固定给16

    hex2int('F')  #为什么名字不一样呢?

    偏函数方法

    import functools

    hex2int2 = functools.partial(int, base = 16)

    hex2int2('A')

    # 偏函数能固定位置参数吗? 能

    max100= functools.partial(max, 100) # 定义一个叫max100的偏函数,将这个偏函数的第一个值固定为100

    max100(101) # 这时候调用它,传入值,与100进行比较

    type(max100) # 偏函数的类型与普通函数不一样

    ##############################################

    递归

    def fool(num):

      if len(num)==1;

        return num[0]

      else:

    #    print(num[0], '>' *6)

    #    print(num[1: ], '  ' *6)

        return num[0] + fool(num[1: ])

    fool([1, 2, 31, 5, 6, 55])

    #函数名本质即变量,同一个函数对象可以被多个变量引用

    def foo(): # 新建一个函数对象,并用foo这个变量名对其进行引用

      pass

    def foo # 对函数对象的引用可以删除

     #回调函数

    def mycalucate(*num)
      return max
    callbackfunc(53,5,33)

    num=-1

    a=b=abs

    #引用

    print(abs, a)

    #调用

    a(num)
    b(-8,8)
    c(7)

    #高阶函数

    一个函数接收另一个函数作为参数传入

    回调函数:函数作为调用函数的结果返回

    函数对象既然可以被引用,那可以作为参数被传入或作为结果被返回吗? 

    可以

    bifs

    内置的高阶函数有:

    l1=[2,3,5,9, 'julyedu.com', [2, 3, 3], 5, 2]

    filter

    语法:filter(function, list)

    函数f的作用是对每个元素进行判断,返回true or false

    filter()根据判断结果自动过滤不符合条件的元素,返回符合条件的新list

    list(filter(lambda) x:True if type(x)== str else False, l1)

    def myfilter(x):

      if x>60:

        return True

      else:

        return False

    myfilter(62)

    l1=[1,62,57]

    filter(myfilter, l1)

    #map

    #语法:map(function, list)

    #让list的每一个元素依次调用   function并获取返回值存入一个新的 list中

    list(map(lambda x:(x, l1. count(x)), l1))

    #reduce 

    语法:reduce(function, list)

    函数function必须包含两个参数, optional可选,如果存在则表示初值为 optional

    reduce() 对list的每个元素反复调用函数 f,并返回最终结果值 

    from functools import reduce

    reduce(lambda a, b:a+b, [1,2,3,4,5,6,7,8])

    求和值返回 36

    reduce 只能是两个变量,不可以三个等等

    #############################################################

    变量的作用域

    闭包closure:涉及嵌套函数时才有闭包问题

    内层函数引用了外层函数的变量(参数),然后返回内层函数的情况

    装饰器

    函数式编程

    ###########################################################

    匿名函数lambda

    print(type(lambda a, b:a**b ))

    定义

    函数体

    不用写return

    使用一:作为正常函数使用,不推荐

    foo=lambda x, y:x+y   #不用写return

    print(foo(5, 6))

    使用二:lambda关键字定义在高阶函数的参数位上

    d1={'china':15, 'India':9, 'usa':2, 'japan':1.5}

    sorted(d1.items(), key=lambda x:(x[0], x[1])) # 按d1.items()第0个元素升序,国家名

    # sorted(d1.items(), key=lambda x:(x[1])) # 按d1.items()第1个元素升序,人口数

    闭包

    def fop4():

      for i in range(5):

        yield i

        yield 'f'  #加入一个yield看看会不会被执行

        i+=1 

    nums_in_global=[15,2,3,9,3,2] #声明一个全局
    def foo1(nums_in_function):
      print('nums_in_function此时是foo1中,可以被访问:', nums_in_function)
      def foo2():
        return max(nums_in_function)
      return foo2
    #print(nums_in_function) #此时已经消失了,name 'nums_in_function' is not defined
    #调用
    foo1([5,3,8])

    ###################################################################

    装饰器

    def foo1():
      print('this is foo1 function')
      print(datetime.datetime.now())


    import datetime
    def printime():
      print(datetime.datetime.now)

    def foo1():
      print('this foo1')
      printime()
    def foo2():
      print('this is foo2 function')
    def foo3():
      print('this is foo3 function')
    def extratime(func):
      print(datetime.datetime.now())
      return func # 利用回调

    decorated=extratime(foo2)
    decorated()

    每一次都要写,还是很麻烦

    import datetime
    def extrafoo(func):
      def inner():
        print('extra:', datetime.now())
        print('from inner to execute:', func._name_)
        print('the', func._name_, 'result:', func())
      return inner
    @extrafoo #装饰器特性,被装饰的函数定义之后立即运行
    def foo1():
      return 'this is fool function'

    #@是Python 装饰器的简便写法,也叫语法糖

    #装饰器语法糖在要被包裹的函数前声明。@后面的函数名,是包裹下边函数的函数名extrafoo

    装饰器使用方便的原因:

    1)python的函数像普通的对象一样能作为参数传递给其他的函数

    2)可以被赋值给其他变量,可以作为返回值, 定义在另一个函数内

    注:return后面有函数名,return的是什么?

      永远是个[]对象!

  • 相关阅读:
    ElasticSearch 清理索引
    Docker 服务接入SkyWalking
    Promethues mysql_exporter 集中式监控
    修改SVN密码自助平台
    快速排序(golang)
    ElasticSearch Xpack集群认证和elasticsearch-head配置
    Ansible一个tasks失败则终止剩余的task
    Consul安装
    最纯净的开发者技术交流社群
    Flutter中的报错:(IOS pod 版本错误) error: compiling for iOS 8.0, but module 'xxx' has a minimum deployment target of iOS 9.0
  • 原文地址:https://www.cnblogs.com/qianyuesheng/p/8428026.html
Copyright © 2020-2023  润新知