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\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
python基础知识踩点的更多相关文章
- Python开发【第二篇】:Python基础知识
Python基础知识 一.初识基本数据类型 类型: int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位 ...
- python基础知识(二)
以下内容,作为python基础知识的补充,主要涉及基础数据类型的创建及特性,以及新数据类型Bytes类型的引入介绍
- python 基础知识(一)
python 基础知识(一) 一.python发展介绍 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本 ...
- python基础知识讲解——@classmethod和@staticmethod的作用
python基础知识讲解——@classmethod和@staticmethod的作用 在类的成员函数中,可以添加@classmethod和@staticmethod修饰符,这两者有一定的差异,简单来 ...
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...
- python 爬虫与数据可视化--python基础知识
摘要:偶然机会接触到python语音,感觉语法简单.功能强大,刚好朋友分享了一个网课<python 爬虫与数据可视化>,于是在工作与闲暇时间学习起来,并做如下课程笔记整理,整体大概分为4个 ...
- python基础知识小结-运维笔记
接触python已有一段时间了,下面针对python基础知识的使用做一完整梳理:1)避免‘\n’等特殊字符的两种方式: a)利用转义字符‘\’ b)利用原始字符‘r’ print r'c:\now' ...
- Python基础知识(五)
# -*- coding: utf-8 -*-# @Time : 2018-12-25 19:31# @Author : 三斤春药# @Email : zhou_wanchun@qq.com# @Fi ...
- Python基础知识(Basic knowledge)
Python基础知识(Basic knowledge) 1.认识Python&基础环境搭建 2.Python基础(上) 3.Python基础(中) 4.Python基础(下) 5.Python ...
随机推荐
- kd树的构造与搜索
学习了两篇博客,存下来以免丢失. http://blog.csdn.net/losteng/article/details/50893739 https://leileiluoluo.com/post ...
- HDU 4691
http://acm.hdu.edu.cn/showproblem.php?pid=4691 留个板子. #include <iostream> #include <cstdio&g ...
- 小程序 之使用HMACSHA1算法加密报文
首先说说我们前端常用的加密技术, 我们常用的加密技术有:如MD5加密,base64加密 今天要说的是HMACSHA1加密技术 先介绍下什么是SHA1算法, 安全哈希算法(Secure Hash Alg ...
- js 时间戳与yyyy-mm-dd或yyyy-MM-dd HH-mm-ss互相转换
首先是获取当前系统时间转换为时间戳 var timestamp = Date.parse(new Date());//获取当前时间 timestamp = timestamp / 1000; 然后是时 ...
- Codeforces Gym101502 J-取数博弈
还有J题,J题自己并不是,套的板子,大家写的都一样,因为大家都是套板子过的,贴一下代码,等学会了写一篇博客... J.Boxes Game 代码: 1 //J. Boxes Game-取数博弈-不会, ...
- java多线程04----------final和static
final和static关键字 final关键字 1.final关键字在单线程中的特点: 1)final修饰的静态成员:必须在进行显示初始化或静态代码块赋值,并且仅能赋值一次. 2)final修饰的类 ...
- SpringMVC整合fastdfs-client-java实现web文件上传下载
原文:http://blog.csdn.net/wlwlwlwl015/article/details/52682153 本篇blog主要记录一下SpringMVC整合FastDFS的Java客户端实 ...
- 【spring boot】13.在spring boot下使用多线程
使用场景: 方法处理到某一步,需要将信息交给另一个线程去处理!! =================================================================== ...
- android studio 在线更新android sdk,遇到无法Fetching https://dl-ssl.google.com/...的解决方案
最近实在受不了eclipse的“迟钝”,准备入手Android studio开发环境,但是貌似不太顺利,成功安装了Android studio,在线更新Android adk的时候,总是遇到如下错误: ...
- js利用offsetWidth和clientWidth来计算滚动条的宽度
原文: http://www.haorooms.com/post/js_scroll_width 参考: https://www.cnblogs.com/benxiaohai-microcosm/p/ ...