zoukankan      html  css  js  c++  java
  • 变量作用域和列表

    1. 变量作用域
      -
      变量按照作用域分类
        - 全局变量: 在函数外部定义
        - 局部变量:在函数内部定义
      - 变量的作用范围
       - 全局变量:在整个全局都可以用,在局部也可以使用
       -  局部变量只能在所在的函数内部使用,例如形参
      - LEGB原则
       - L(local) 局部
       - E(Elclosing function locale) 外部嵌套函数作用域
       - G(Global module) 函数定义所在模块作用域
       - B(Buildin) python内置模块的作用域
    2. 提升局部变量为全局变量
      - 使用global
      -需要注意的是,需要先用global进行变量提升,然后在对变量进行赋值等操作,函数必须在调用之后,被提升的变量才可以使用
      a1 = 100
      def fun():
          global a2 
          b2 = 200
      
      
      fun() #只有在函数被调用后,提升的变量才能变成全局
      print(b2)
    3. globals() 与 locals() 函数
      -  用来显示局部变量和全局变量
      a = 1
      
      def fun(b):
          e = 100
          print('globals is {0}'.format(globals()))
          print('locals is {0}'.format(locals()))
      
      fun(200)
    4. eval() 函数
      - 把字符串当成一个表达式来执行
          eval(string_code, globals=None, locals=None)  globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。
        恶意代码 : eval("__import__('os').system('dir')")

      x = 1
      y = 2
      z = eval("x+y")
      print(z) # 3
    5. exec() 函数
      -  将字符串当成代码执行,但是不返回结果,同样可以用来执行恶意代码
    6. 递归函数
      - 函数直接或间接调用自身
      - 好处:简洁,容易理解
      -  缺点:消耗资源大
      - 对递归深度有限制,超过限制报错
      - 写递归程序的时候要    ===>  注意结束条件
      # 递归调用深度限制代码
      x = 0
      def fun():
          global x
          x += 1
          print(x)
          #函数调用自己
          fun()
      fun()
    7. 斐波那契数列:一列数字,第一个值是1 ,第二个值是1,从第三个开始,每一个数字的值等于前两个数字的值的和
       - f(1) = 1 f(2) = 1 f(n)=f(n-1)+f(n+1)
       - 1 1 2 3 4 8 13 ...
      def fun(n):
          if n == 1:
              return 1
          if n == 2:
              return 1
          return fun(n - 1) + fun(n - 2)
      
      print(fun(6))  # 8
    8. 汉诺塔问题
       假设有一个盘子 n = 1,A >C
                 两个盘子 n = 2,A>B  A>C  B>C
                 三个盘子 n = 3,把A上的两个小盘子移动到B上,把A上剩下的一个大盘子放到C上,把B上的两个盘子,借助A放到C上去
                n个盘子 把A上的n-1个盘子,借助C移动到B上,把A上剩下的最后一个大盘子,放到C上,把B上n-1个盘子,借助A放到C上
      def hannuota(n, a, b, c):
          """
              n 代表盘子的个数
              a ,代表第一个托盘,
              b 是第二个托盘
              c 是第三个托盘
          """
          if n == 1:
              print(a,'--->',c)
          #if n == 2:
            #  print(a,'--->',b)
             # print(a,'--->',c)
             # print(b,'--->',c)
             # return None
          hannuota(n-1, a, b, c)
          print(a, '--->', c)
          hannuota(n-1, b, a, c)
      
      
      a = 'A'
      b = 'B'
      c = 'C'
      hannuota(10,a,b,c)
      1.  
        1. 内置数据结构(变量类型)
          - list  列表    [1,2]
          - tuple  元组   (1,2,'a')
          - dict 字典 {'a':1, 'b':2}
          - set  集合
          ---  list 创建列表 a = list()    a =[]
            - 分片操作:实际上是新生成了一个list
             - 对列表进行任意一段的截取
             - list[indexStart : indexEnd : stride]  截取开始,截取结束,截取长度 结果不包含截取结束
             - list[1:3]、 list[:3]、 list[:]、list[2:]   list[::-1] 可以将列表倒序
           - 规定:从右向左数 最右边第一个下标为 -1 , 左边的值要小于右边的值,默认是从左向右进行分片,如果左边的值必须大于右边的值,则步长必须为负数
            列表的增删改:
             - 增 append()方法 a.append(1)
            - 删 del     del a[0] : 将下标为0的元素删除
            - 改 a[2] = 'b'
            - 列表相加 就是将列表接在一起 a=[0] b=[1] a+b => [0,1] 
            - 列表与一个整数相乘,相当于整数个列表相加
            - 列表成员资格运算:判断一个元素是否在列表中,关键词 in/not in ,例如: a=[1,2,3] b=3 c = b in a =>c =True   
            - 列表嵌套: a = [[1,2],[3,4],[5,6]]  
                               for k,v in a:  #这样使用有条件 列表中的每个列表的长度必须一致,for后面的变量必须与列表中的列表的元素个数一致
                        print(k,'------',v)
            - 列表内涵 list content
            - 将列表中的每个元素乘以10生成一个新的列表  a = [1,2,3]  b = [i*10 for i in a] print(b)
             - 过滤掉原来列表中的某个(些)元素,生成一个新的列表
                - a = [i for i in range(100)]    b = [i for i a if m%2 == 0]  print(b) #将a列表中的偶数放入到一个新的列表中
             - 列表生成式可以嵌套
                 -  a = [i for i in range(1,5)]   b = [j for j in range(100,400) if j%100==0]   c = [m+n for m in a for n in b] print(c)
          - 列表的相关函数 len(list) 列表的长度 | max(list)  列表的最大值 | list() 将其他格式的转换为list格式
    9. 内置函数 id() 显示一个变量或者数据的唯一确定的编号
  • 相关阅读:
    Gradle 10分钟上手指南
    java并发编程学习: 原子变量(CAS)
    java并发编程学习: 守护线程(Daemon Thread)
    java并发编程学习: 阻塞队列 使用 及 实现原理
    java并发编程学习: ThreadLocal使用及原理
    java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)
    ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表
    gradle项目与maven项目相互转化
    rpc框架之 thrift连接池实现
    java并发编程学习:用 Semaphore (信号量)控制并发资源
  • 原文地址:https://www.cnblogs.com/Abelte/p/9602715.html
Copyright © 2011-2022 走看看