• 2.3 Python语言基础


    2.3 Python语言基础

    1 语言语义(Language Semantics)

    缩进,而不是括号

    Python使用空格(tabs or spaces)来组织代码结构,而不是像R,C++,Java那样用括号。

    建议使用四个空格来作为默认的缩进,设置tab键为四个空格

    另外可以用分号隔开多个语句:

    a = 5; b = 6; c = 7
    

    所有事物都是对象(object)

    在python中,number,string,data structure,function,class,module都有自己的“box”,即可以理解为Python object(对象)。下面所有的对象直接用object来指代。

    调用函数和对象的方法

    用圆括号

    result = f(x,y,z)
    

    动态参考,强类型

    不像C++,Java之类的语言,python中object reference是没有自带类型的。但是可以通过type来查看类型:

    a = 5
    type(a)
    

    int

    类型信息存储在这个对象本身。

    而python可以看做是强类型,即每一个object都有一个明确的类型。所以下面的运算不会成立。但是Visual Basic会把'5'变为整数(int),而JavaScript会把5变为字符串(string)

    '5' + 5
    

    TypeError Traceback (most recent call last)
    in ()
    ----> 1 '5' + 5

    TypeError: Can't convert 'int' object to str implicitly

    不过像是int与float之间倒是会隐式转换:

    a = 4.5
    b = 2
    print('a is {0}, b is {1}'.format(type(a), type(b)))
    

    a is <class 'float'>, b is <class 'int'>

    a / b
    

    2.25

    因为知道每个Object的类型很重要,我们可以用isinstance函数来查看object的类型

    a = 5
    isinstance(a, int)
    

    True

    查看a、b是否是int或float类型

    a=5;b=4.5
    
    isinstance(a, (int, float))
    

    True

    isinstance(a, (int, float))
    

    True

    属性和方法

    属性(Attributes)指在当前这个object里,还有一些其他的python object。方法(method)指当前这个object自带的一些函数,这些函数可以访问object里的内部数据。

    通过obj.attribute_name可以查看:

    a='foo'
    
    a.<Press Tab>
    

    可以通过getattr函数来访问属性和方法:

    getattr(a, 'split')
    

    Duck typing

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试(见下面的“历史”章节),“鸭子测试”可以这样表述:

    “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

    在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。

    比如,如果一个object能够实现迭代原则,那么这个object就是可迭代的。我们可以看这个object是否有__iter__这个magic method。或者自己写一个iter function来检测:

    def isiterable(obj):
        try:
            iter(obj)
            return True
        except TypeError: # not iterable
            return False
    
    isiterable('a string')
    

    True

    isiterable([1, 2, 3])
    

    True

    isiterable(5)
    

    False

    这个功能多用于写一些能接受多种类型的函数。比如我们写一个函数,用接收任何序列(list, tuple, ndarray) 甚至一个迭代器。如果接收的不是一个list,那么我们就人为将其转变为一个list:

    if not isinstance(x, list) and isiterable(x): # 如果x不是list,且x可迭代
        x = list(x) # 转变x为list
    

    Import(导入)

    比如我创建了一个some_module.py的文件,里面写着:

    # some_module.py PI = 3.14159
    
    def f(x):
        return x + 2
    
    def g(a, b):
        return a + b
    

    那么在别的文件里,有多重导入方式:

    # 1
    import some_module
    result = some_module.f(5) 
    pi = some_module.PI
    
    # 2
    from some_module import f, g, PI 
    result = g(5, PI)
    
    # 3
    import some_module as sm 
    from some_module import PI as pi, g as gf
    
    r1 = sm.f(pi) 
    r2 = gf(6, pi)
    

    运算符(Binary operators)

    用is,和is not, 检查两个引用(references)是否指同一个object,

    a = [1, 2, 3]
    
    b = a
    
    c = list(a)
    
    a is b
    

    True

    a is not c
    

    True

    因为c = list(a)中的list函数创建了一个新的list,所以c是一个新的list,不指向原来的a。

    另一个is的常用法是用来检查一个instance是不是none:

    a = None
    
    a is None
    

    True

    另外像是,+, - ,==, <=, &, |等都也算是运算符,这个就不详细说了,可以直接看这个链接

    可更改和不可更改对象(Mutable and immutable objects)

    在python的object中,lists, dicts, NumPy arrays, 以及用户自定义的类型(classes), 都是可以更改的。

    而string和tuple是不可以更改的:

    2 标量类型(scalar types)

    这种类型指的是None,str, bytes, float, bool, int

    数值型

    ival = 123554
    
    ival ** 6
    

    3557466836753811461234217695296

    fval = 7.234
    fval2 = 5.43e-5
    
    5/2
    

    2.5

    #取商
    5//2
    

    2

    #取余数
    5 % 2
    

    1

    字符串

    a = 'one way of writing a string' 
    b = "another way"
    c = """ 
        This is a longer string that 
        spans multiple lines 
        """
    
    c.count('
    ') # 有三个回车符
    

    3

    字符串类型是不可变的:

    a[10] = 'f'
    

    TypeError Traceback (most recent call last)
    in ()
    ----> 1 a[10] = 'f'

    TypeError: 'str' object does not support item assignment

    把其他类型转换为字符串:

    a = 5.6
    s = str(a)
    s
    

    '5.6'

    因为字符串是一连串Unicode字符,所以可以当序列来处理,像list和tuple一样:

    s = 'python'
    list(s)
    

    ['p', 'y', 't', 'h', 'o', 'n']

    s[:3]
    

    'pyt'

    反斜线用来制定特别的字符,比如回车符

    s = '12\34'
    print(s)
    

    1234

    可以用前缀r来直接写出想要的字符串格式,而不用输入很多反斜杠:

    s = r'thishas
    ospecialcharacters'
    
    # 实际的s
    s
    

    'thishas ospecialcharacters'

    # 加法用于连接两个字符串
    s + s
    

    'thishas ospecialcharactersthishas ospecialcharacters'

    字符串的模板,或叫做格式化,是一个很重要的课题。string ojecjt有一个format的方法:

    template = '{0:.2f} {1:s} are worth US${2:d}'
    template
    

    '{0:.2f} {1:s} are worth US${2:d}'

    在这个string中:

    • {0:.2f} : 第一个参数为float类型,去小数点后两位

    • {1:s}: 把第二个参数变为string类型

    • {2:d}: 把第三个参数变为一个精确的整数

    template.format(4.5560, 'Argentine Pesos', 1)
    

    '4.56 Argentine Pesos are worth US$1'

    返回总目录

  • 相关阅读:
    就打排序算法总结
    php 垃圾回收机制写时复制和引用计数
    zend studio 使用断点调试
    SiteServer 迁移至 Windows 2008 R2 问题汇总
    [项目改造中的点滴]C#中IDataReader和DataSet的区别与使用场景
    顺序分支知识总结
    我的第一篇博客
    [原创]删除GRUB引导恢复Windows引导,不用下载任何工具
    在C++builder中使用正则表达式,非boost库,简单!~
    SQL 存储过程优化经验
  • 原文地址:https://www.cnblogs.com/hankleo/p/9942835.html
Copyright © 2020-2023  润新知