• python基础知识


     

    1.eval()函数

     

    参数: source:一个Python表达式或函数compile()返回的代码对象
    globals:可选。必须是dictionary
    locals:可选。任意map对象

    In [2]:
    a = '[1,2,3]'
    eval(a)
    
    Out[2]:
    [1, 2, 3]
    In [3]:
    a = '1'
    b = 3
    eval(a) + b
    
    Out[3]:
    4
    In [4]:
    a = 10
    eval("a+1")
    
    Out[4]:
    11
    In [5]:
    a = 10
    g = {'a': 4}
    eval("a+1", g)
    
    Out[5]:
    5
     

    这里面可能有点绕啊,初学者得理理清楚。在这次的代码中,我们在 eval中提供了globals参数,这时候eval的作用域就是g指定的这个字典了,也就是外面的a=10被屏蔽掉了,eval是看不见的,所以使用了a为4的值。

    In [6]:
    a = 10
    b = 20
    c = 30
    g = {'a': 6, 'b': 8}
    t = {'b': 100, 'c': 10}
    eval('a+b+c', g, t)
    
    Out[6]:
    116
     

    这里面就更有点绕人了,此次执行的结果中,a是6,b是100,c是10。我们首先来看一下,对于a为6我们是没有疑问的,因为在上个例子中已经说了,g会屏蔽程序中的全局变量的,而这里最主要的是为什么b是100呢?还记得我们在参数介绍的时候说过,当locals和globals起冲突时,locals是起决定作用的,这在很多编程语言里都是一样的,是作用域的覆盖问题,当前指定的小的作用域会覆盖以前大的作用域,这可以理解为一张小的纸盖在了一张大的纸上,纸是透明的,上面写的东西是不透明的,而它们重合的地方就可以理解成两个作用域冲突的地方,自然是小的显现出来了。

     

    2.切片

    In [8]:
    a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    a[::-1]  # 逆序列表
    
    Out[8]:
    [9, 8, 7, 6, 5, 4, 3, 2, 1]
    In [9]:
    a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    a[::-1]
    
    Out[9]:
    [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
     

    隔一个元素取一个元素,获取偶数位置的元素

    In [10]:
    a[::-2]
    
    Out[10]:
    [10, 8, 6, 4, 2]
    In [11]:
    a[::2]
    
    Out[11]:
    [1, 3, 5, 7, 9]
     

    隔一个元素取一个元素,获取奇数位置的元素

    In [12]:
    a[1::2]
    
    Out[12]:
    [2, 4, 6, 8, 10]
     

    3.函数中的可变参数

     

    可变参数在定义函数时,主要有两种形式* para和** para,前者用来接收任意多个实参,并放入一个元组中;后者接收类似于关键参数一样显示赋值形式的任意多个实参,并放入一个字典中。

    In [13]:
    def fun(*p):
        print(p)
    
    In [14]:
    fun(1, 2, 3)
    
     
    (1, 2, 3)
    
    In [15]:
    fun(12, 12, 13, 14)
    
     
    (12, 12, 13, 14)
    
    In [16]:
    def add(*p):
        sum = 0
        for i in p:
            sum += i
        print(sum)
    
    In [17]:
    add(1, 2, 3)
    
     
    6
    
    In [18]:
    add(1, 2, 3, 4, 5)
    
     
    15
    
    In [19]:
    def fun_dic(**p):
        print(p)
    
    In [20]:
    fun_dic(a=1, b=2)
    
     
    {'a': 1, 'b': 2}
    
     

    4.传递参数时的时序解包

     

    调用含有多个参数的函数时,可以使用python列表、元组、集合、字典及其他可迭代对象作为实参,并在实参命名前加一个*,python解释器将自动进行解包,然后传递给多个单变量形参。

    In [21]:
    def demo(a, b, c):
        print(a + b + c)
    
    In [23]:
    seq = [1, 2, 3]
    demo(*seq)
    
     
    6
    
    In [24]:
    t = (2, 3, 4)
    
    In [25]:
    demo(*t)
    
     
    9
    
    In [26]:
    dic = {1: 'a', 2: 'b', 3: 'c'}
    demo(*dic)
    
     
    6
    
    In [27]:
    demo(*dic.values())
    
     
    abc
    
     

    5.函数参数和返回值的类型指定和检查

     

    在python3.5之后,就新增了对函数参数和返回值的类型指定和检查,以及在新建变量时也可以指定类型。

     

    例如,下面这个函数test,指定了输入参数a为int类型,而b为str类型,并且返回值为srt类型。可以看到,
    在方法中,我们最终返回了一个int,此时pycharm就会有警告;
    当我们在调用这个方法时,参数a我们输入的是字符串,此时也会有警告;
    但非常重要的一点是,pycharm只是提出了警告,但实际上运行是不会报错,毕竟python的本质还是动态语言

    In [33]:
    def test(a: int, b: str)-> int:
        return str(a) + b
    
    In [34]:
    test(1, 2)
    
     
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    <ipython-input-34-f4ef31738bb7> in <module>()
    ----> 1test(1, 2)
    
    <ipython-input-33-66586b09db06> in test(a, b)
          1 def test(a: int, b: str)-> int:
    ----> 2return str(a) + b
    
    TypeError: must be str, not int
    In [35]:
    test(1, '2')
    
    Out[35]:
    '12'
  • 相关阅读:
    redis.conf 参数说明
    BD2 catalog编目
    Altium Designer -在PCB中统一修改元器件标号的位置
    AD使用技巧-怎样绘制圆形敷铜
    运放压百率
    Altium designer 新建快捷键
    修改AD中PCB各层的透明度
    Altium Designer 使用小技巧2
    Altium Designer 使用中的小技巧1
    网络库的设计与实现
  • 原文地址:https://www.cnblogs.com/xinmomoyan/p/14366636.html
Copyright © 2020-2023  润新知