python基础知识踩点

简介: 1、注释在python中,注释是以任何存在于#右侧的文字,其主要作用是写给程序读者看的笔记。例如单行注释>>print("hello world") #这是一个注释多行注释使用一对''''''这是注释这是注释这是注释'''2、Python2的中文编码问题python2中默认的编码不支持中文,如果要在python2中支持中文,需要在.py文件的开头声明使用的编码。

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\n'

In [3]: f.__next__()
Out[3]: 'print(sys.path)\n'

In [4]: f.__next__()
Out[4]: 'x = 2\n'

In [5]: f.__next__()
Out[5]: 'print(2**10)\n'

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\n'

In [9]: f.__next__()
Out[9]: 'print(sys.path)\n'

In [10]: f = open('script1.py')

In [11]: next(f)
Out[11]: 'import sys\n'

In [12]: next(f)
Out[12]: 'print(sys.path)\n'

生成器都是 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

相关文章
|
6月前
|
消息中间件 分布式计算 监控
Python面试:消息队列(RabbitMQ、Kafka)基础知识与应用
【4月更文挑战第18天】本文探讨了Python面试中RabbitMQ与Kafka的常见问题和易错点,包括两者的基础概念、特性对比、Python客户端使用、消息队列应用场景及消息可靠性保证。重点讲解了消息丢失与重复的避免策略,并提供了实战代码示例,帮助读者提升在分布式系统中使用消息队列的能力。
215 2
|
6月前
|
机器学习/深度学习 数据采集 数据可视化
Python数据分析入门:基础知识与必备工具
【4月更文挑战第12天】Python是大数据时代数据分析的热门语言,以其简单易学和丰富库资源备受青睐。本文介绍了Python数据分析基础,包括Python语言特点、数据分析概念及其优势。重点讲解了NumPy、Pandas、Matplotlib、Seaborn和Scikit-learn等必备工具,它们分别用于数值计算、数据处理、可视化和机器学习。此外,还概述了数据分析基本流程,从数据获取到结果展示。掌握这些知识和工具,有助于初学者快速入门Python数据分析。
134 2
|
5月前
|
设计模式 开发者 Python
探索Python中的异步编程:从基础知识到实践应用
【6月更文挑战第6天】本文旨在深入探讨Python中的异步编程概念,包括其背后的原理、常用的库和框架以及如何在实际项目中应用这些知识。文章将通过具体的代码示例和场景分析,帮助读者理解异步编程在提升程序性能和处理并发任务中的重要性。
|
4月前
|
存储 人工智能 数据挖掘
十分钟学习Python基础知识
Python是一种高效、易学且功能强大的编程语言,广泛应用于数据分析、人工智能、Web开发等领域。如果你是编程新手,想要快速入门Python,那么这篇文章将是你的最佳选择。我将在十分钟内带你了解Python的基础知识。
|
5月前
|
索引 Python
Python考试基础知识
Python考试基础知识
|
5月前
|
关系型数据库 MySQL 数据库
探索Python中的异步编程:从基础知识到高级应用
【6月更文挑战第8天】随着技术的进步,异步编程已经成为现代软件开发中不可或缺的一部分。本文将深入探讨Python中的异步编程,包括其基础知识、常用库和框架,以及一些高级应用。我们将通过实例来展示如何有效地使用异步编程来提高程序的性能和响应性。无论你是初学者还是经验丰富的开发者,这篇文章都会为你提供有价值的见解和技巧。
54 2
|
5月前
|
存储 关系型数据库 API
探索Python中的异步编程:从基础知识到实际应用
【6月更文挑战第6天】在本文中,我们将深入探讨Python中的异步编程,这是一种强大的编程技术,可以帮助我们更有效地处理并发任务。我们将从基础知识开始,然后逐步深入到实际应用,包括异步I/O操作、异步Web请求和异步数据库操作等。最后,我们将通过一个实际的项目案例,展示如何在Python中使用异步编程来提高程序的性能和效率。
|
5月前
|
JavaScript 前端开发 Java
python的入门基础知识和一些小技巧
python的入门基础知识和一些小技巧
31 0
|
5月前
|
算法 Python
Python基础教程(第3版)中文版 第一章 快速上手:基础知识(笔记)
Python基础教程(第3版)中文版 第一章 快速上手:基础知识(笔记)
|
6月前
|
Java 程序员 Python
Python基础知识主要包括其**语法规则、数据类型、控制结构以及函数和模块**等
【4月更文挑战第15天】Python基础知识主要包括其**语法规则、数据类型、控制结构以及函数和模块**等
54 11