zoukankan      html  css  js  c++  java
  • 函数,

    定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,想执行这个函数,调用函数名

    特性:减重,可扩展,易维护

    def calc(x,y):

      res = x**y

      return res  #1return会结束函数,后面的代码不会执行  2返回res给calc

      print res

    calc(2,10)  #调用

    返回值return,返回给调用者,如果没有返回值,默认返回none

    参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

    实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

    def print_info(age,name,sex = 'male'):
    print('Name: %s'%name)
    print("Age: %d"%age)
    print('Sex: %s'%sex)
    print_info(19,'孙礼昭')#顺序参数
    print_info(name = 'slz',age=19)#关键字参数
    print_info(19,'slz')#默认参数
    #不定长参数 参数前面加个*,可以获取多个值(做成元组)
    # ** 做成字典 用于关键字参数

    def add2(*arge):
    sum1 = 0
    for i in arge:
    sum1 += i
    print(sum1)
    add2(1,2,3,4,5)
    # 位置关系 从左到右顺序是
    # 顺序参数,关键字参数--->默认参数--->*不定长参数--->**不定长参数
    #name --> name = 'slz' --> *arg --> **kwargs
    #使用***,要注意顺序 *一定要放在前面().. **一定要放在后面()

    递归:在函数内部,可以调用其它函数.如果一个函数在内部调用它自身,这个函数就是递归函数

    def calc(n):

      print('n:'n)

      if int(n/2) == 0:

        return n

      return calc(int(n/2))

    calc(10)

    递归特性:

    必须有一个明确的结束条件

    每次进入更深一层递归时,问题规模相比上次递归有所减少

    递归效率不高,递归层次过多会导致栈溢出

    实例:二分查找

    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
    def binary_search(dataset,find_num):
        print(dataset)
     
        if len(dataset) >1:
            mid = int(len(dataset)/2)
            if dataset[mid] == find_num:  #find it
                print("找到数字",dataset[mid])
            elif dataset[mid] > find_num :# 找的数在mid左面
                print("33[31;1m找的数在mid[%s]左面33[0m" % dataset[mid])
                return binary_search(dataset[0:mid], find_num)
            else:# 找的数在mid右面
                print("33[32;1m找的数在mid[%s]右面33[0m" % dataset[mid])
                return binary_search(dataset[mid+1:],find_num)
        else:
            if dataset[0] == find_num:  #find it
                print("找到数字啦",dataset[0])
            else:
                print("没的分了,要找的数字[%s]不在列表里" % find_num)
    binary_search(data,66)
     
    匿名函数
      匿名函数就是不需要显示的指定函数
      python使用lambda来创建匿名函数
    格式:
      lambda参数列表: return[表达式]变量
      由于lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收
      r = lambda x,y:x*y
      print r(10,20)

    变量作用域

    Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

    变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:

    • L (Local) 局部作用域
    • E (Enclosing) 闭包函数外的函数中
    • G (Global) 全局作用域
    • B (Built-in) 内建作用域

    以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

    x = int(2.9)  # 内建作用域
     
    g_count = 0  # 全局作用域
    def outer():
        o_count = 1  # 闭包函数外的函数中
        def inner():
            i_count = 2  # 局部作用域

    Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,

    全局变量和局部变量

      定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域

     def fun():
    numm*=2
    print('函数内部调用numm',numm)
    numm = 1
    print('初始化numm:',numm)
    fun()
    print('函数外部调用numm',numm)

    报错了。这是因为在fun()函数使用了局部变量num1,它只是个跟全局变量同名的局部变量,使用前还是要赋值,因此再次强调不要这样使用

    如果真的想要在函数体内修改全局变量的值,就要使用global关键字

    def fun():
    global numm
    numm *= 5
    print('函数内部调用numm',numm)
    numm = 1
    print('初始化numm:',numm)
    fun()
    print('函数外部调用numm',numm)


    想调用函数外层的,但不是全局变量,就用nonlocal关键
    def fun2():
    num2 = 3
    def fun3():
    nonlocal num2
    num2 *= 2
    print('num2=',num2)
    return 18
    return fun3()
    print(fun2())


     

  • 相关阅读:
    SpringBoot中获取上下文
    @Import
    SpringBoot集成Swagger-Bootstrap-UI(已改名为Knife4j)
    SpringFox 3.0.0(包含springfox-swagger2-3.0.0)——无法访问/swagger-ui.html解决方案
    容器编排技术 docker compose 20210816
    SC Nacos 服务注册和发现202107
    GitHub Desktop报错 Authentication failed. Some common reasons include
    arcgis esriGeometryType
    小程序H5接口测试整理(JMeter)
    python+检查图像文件是否损坏,是,删除
  • 原文地址:https://www.cnblogs.com/sunlizhao/p/8454512.html
Copyright © 2011-2022 走看看