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

  • 相关阅读:
    python 的基础 学习 第六天 基础数据类型的操作方法 字典
    python 的基础 学习 第五天 基础数据类型的操作方法
    python 的基础 学习 第四天 基础数据类型
    ASP.NET MVC 入门8、ModelState与数据验证
    ASP.NET MVC 入门7、Hellper与数据的提交与绑定
    ASP.NET MVC 入门6、TempData
    ASP.NET MVC 入门5、View与ViewData
    ASP.NET MVC 入门4、Controller与Action
    ASP.NET MVC 入门3、Routing
    ASP.NET MVC 入门2、项目的目录结构与核心的DLL
  • 原文地址:https://www.cnblogs.com/qixidi/p/10160589.html
Copyright © 2011-2022 走看看