zoukankan      html  css  js  c++  java
  • python基础知识踩点

    1、注释

    在python中,注释是以任何存在于#右侧的文字,其主要作用是写给程序读者看的笔记。

    
    例如
    单行注释
    >>print("hello world") #这是一个注释
    
    多行注释使用一对'''
    '''
    这是注释
    这是注释
    这是注释
    '''
    

    2、Python2的中文编码问题

    python2中默认的编码不支持中文,如果要在python2中支持中文,需要在.py文件的开头声明使用的编码。

    
    在py文件的开头添加下面语句:
    #coding=utf-8
    也可以有另外一种声明格式:
    #-*- coding:utf-8 -*-
    

    3、python2和python3中输入功能不同

    python2和python3中获取输入的方法不同,需要注意所有从键盘获取的输入都是字符串类型。

    
    在python2中,获取输入的方法是:
    >>>a = raw_input("请输入内容:")
    
    在python3中,获取输入的方法是:
    >>>a = input("请输入内容:")
    

    4、变量类型转换

    5、"is"和"=="的区别

    6、真除法和地板除

    在python中实际上有3种类型的除法,有2种不同的除法操作符,其中一种在python3中有了变化:
    x / y
    传统除法和真除法。在python2.6或之前的版本中,这个操作对于整数会省去小数部分,对于浮点数会保持小数部分。在python3.0版本中将会变成真除法(无论任何类型都会保存小数部分)
    x // y
    floor除法(地板除)。在python2.6中新增的操作,在python2.6和python3.0中均能使用。这个操作不考虑操作对象的类型,总会省略结果的小数部分,剩下最小的能整除的整数部分。

    
    python@ubuntu:~$ ipython3
    Python 3.5.2 (default, Jul  5 2016, 12:43:10) 
    In [1]: 10 / 4
    Out[1]: 2.5
    
    In [2]: 10 //4
    Out[2]: 2
    
    In [3]: 10 /4.0
    Out[3]: 2.5
    
    In [4]: 10 //4.0
    Out[4]: 2.0
    
    python@ubuntu:~$ ipython
    Python 2.7.12 (default, Jul  1 2016, 15:12:24)
    In [1]: 10 / 4
    Out[1]: 2
    
    In [2]: 10 / 4.0
    Out[2]: 2.5
    
    In [4]: 10 // 4
    Out[4]: 2
    
    In [5]: 10 // 4.0
    Out[5]: 2.0
    
    

    7、迭代器

    可迭代对象:如果对象是实际保存的序列,或者可以在可迭代工具环境中一次产生一个结果的对象,就可以看做是可迭代的,也就是迭代器。
    可迭代协议:有__next__方法的对象会前进到下一个结果,而在一系列结果的末尾,则会引发StopIteration。在python中,任何这类对象都认为是可迭代的。任何这类对象能以for循环或者其他迭代工具遍历,因为所有迭代工具内部工作起来就是每次迭代中调用__next__,并且捕捉StopIteration异常来确定何时离开。

    
    字符串迭代器
    In [1]: for i in "abc":
       ...:     print(i)
       ...:     
    a
    b
    c
    文件迭代器:
    In [1]: f = open('script1.py')
    
    In [2]: f.__next__()
    Out[2]: 'import sys
    '
    
    In [3]: f.__next__()
    Out[3]: 'print(sys.path)
    '
    
    In [4]: f.__next__()
    Out[4]: 'x = 2
    '
    
    In [5]: f.__next__()
    Out[5]: 'print(2**10)
    '
    
    In [6]: f.__next__()
    ---------------------------------------------------------------------------
    StopIteration                             Traceback (most recent call last)
    <ipython-input-6-39ec527346a9> in <module>()
    ----> 1 f.__next__()
    
    StopIteration:
    
    

    手动迭代:iter和next
    为了支持手动迭代代码,python3提供了一个内置函数next,它会自动调用一个对象的__next__方法。给定一个可迭代对象x,调到next(x)等同于x.__next__(),但前者简单得多。

    
    例如,对于文件的任何一种形式都可以使用
    In [7]: f = open('script1.py')
    
    In [8]: f.__next__()
    Out[8]: 'import sys
    '
    
    In [9]: f.__next__()
    Out[9]: 'print(sys.path)
    '
    
    In [10]: f = open('script1.py')
    
    In [11]: next(f)
    Out[11]: 'import sys
    '
    
    In [12]: next(f)
    Out[12]: 'print(sys.path)
    '
    
    

    生成器都是 Iterator 对象,但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。

    把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数:

    
    In [26]: L = [11,22,33]
    
    In [27]: I = iter(L)
    
    In [28]: next(I)
    Out[28]: 11
    
    In [29]: next(I)
    Out[29]: 22
    
    In [30]: next(I)
    Out[30]: 33
    
    

    判断一个数据类型是否是可迭代器对象。
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    可以使用 isinstance() 判断一个对象是否是 Iterator 对象:

    
    In [39]: from collections import Iterator
    
    In [40]: isinstance((x for x in range(10)),Iterator)
    Out[40]: True
    
    In [41]: isinstance([],Iterator)
    Out[41]: False
    
    In [42]: isinstance({},Iterator)
    Out[42]: False
    
    In [43]: isinstance("abc",Iterator)
    Out[43]: False
    
    In [44]: isinstance(100,Iterator)
    Out[44]: False
    
    In [45]: f = open('script1.py')
    
    In [46]: isinstance(f,Iterator)
    Out[46]: True
    
    

    总结:
    凡是可作用于 for 循环的对象都是 Iterable 类型;
    凡是可作用于 next() 函数的对象都是 Iterator 类型
    集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。

    8、动态添加属性和方法

    动态编程语言 是 高级程序设计语言 的一个类别,在计算机科学领域已被广泛应用。它是一类 在运行时可以改变其结构的语言 :例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力。例如JavaScript便是一个动态语言,除此之外如 PHP 、 Ruby 、 Python 等也都属于动态语言,而 C 、 C++ 等语言则不属于动态语言。----来自 维基百科
    在python中,可以在程序运行过程中添加属性和方法:

    
    添加属性:
    >>> class Person(object):
        def __init__(self, name = None, age = None):
            self.name = name
            self.age = age
    >>> P = Person("小明", "24")
    #在这里,我们定义了1个类Person,在这个类里,定义了两个初始属性name和age。
    #如果我们想添加一个性别的属性可以这样做:
    >>> P.sex = "male"
    >>> P.sex
    'male'
    >>>
    
    #如果要添加的属性对于类的所有对象都适用,那么可以将这个属性绑定在类上
    >>>> Person.sex = None #给类Person添加一个属性
    >>> P1 = Person("小丽", "25")#创建一个新对象
    >>> print(P1.sex) #如果P1这个实例对象中没有sex属性的话,那么就会访问它的类属性
    None #可以看到没有出现异常
    >>>
    

    动态添加方法

    
     >>> class Person(object):
        def __init__(self, name = None, age = None):
            self.name = name
            self.age = age
        def eat(self):
            print("eat food")
    
    
    >>> def run(self, speed):
        print("%s在移动, 速度是 %d km/h"%(self.name, speed))
    
    
    >>> P = Person("老王", 24)
    >>> P.eat()
    eat food
    >>> 
    >>> P.run()
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        P.run()
    AttributeError: Person instance has no attribute 'run'
    >>>
    >>>
    >>> import types
    >>> P.run = types.MethodType(run, P)
    >>> P.run(180)
    老王在移动,速度是 180 km/h
    

    既然给类添加方法,是使用"类名.方法名 = xxxx",那么给对象添加一个方法也是类似的"对象.方法名 = xxxx"
    完整代码如下:

    
    import types
    
    #定义了一个类
    class Person(object):
        num = 0
        def __init__(self, name = None, age = None):
            self.name = name
            self.age = age
        def eat(self):
            print("eat food")
    
    #定义一个实例方法
    def run(self, speed):
        print("%s在移动, 速度是 %d km/h"%(self.name, speed))
    
    #定义一个类方法
    @classmethod
    def testClass(cls):
        cls.num = 100
    
    #定义一个静态方法
    @staticmethod
    def testStatic():
        print("---static method----")
    
    #创建一个实例对象
    P = Person("老王", 24)
    #调用在class中的方法
    P.eat()
    
    #给这个对象添加实例方法
    P.run = types.MethodType(run, P)
    #调用实例方法
    P.run(180)
    
    #给Person类绑定类方法
    Person.testClass = testClass
    #调用类方法
    print(Person.num)
    Person.testClass()
    print(Person.num)
    
    #给Person类绑定静态方法
    Person.testStatic = testStatic
    #调用静态方法
    Person.testStatic()
    

    9、__slots__的作用

    动态语言与静态语言的不同:
    动态语言:可以在运行的过程中,修改代码。
    静态语言:编译时已经确定好代码,运行过程中不能修改。
    如果我们想要限制实例的属性怎么办?比如,只允许对Person实例添加name和age属性。
    为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

    
    >>> class Person(object):
        __slots__ = ("name", "age")
    
    >>> P = Person()
    >>> P.name = "老王"
    >>> P.age = 20
    >>> P.score = 100
    Traceback (most recent call last):
      File "<pyshell#3>", line 1, in <module>
    AttributeError: Person instance has no attribute 'score'
    >>>
    

    注意:
    使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

    
    In [67]: class Test(Person):
        ...:     pass
        ...:
    
    In [68]: t = Test()
    In [69]: t.score = 100
    

    来源:https://segmentfault.com/a/1190000017439131

  • 相关阅读:
    SHELL 基本语法
    SHELL 入门
    Kahana::Cache
    AUTH 用户管理操作
    继承和委托关系
    ORM 构造和add 方法
    游标的使用
    有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
    01背包 模板1
    poj 2533
  • 原文地址:https://www.cnblogs.com/qixidi/p/10160589.html
Copyright © 2011-2022 走看看