变量与基本类型
特殊字符
- 井号(#) 表示之后的字符为Python注释
- 换行(\n) 是标准的行分割符(通常一个语句一行)
- 反斜线(\) 继续上一行 建议采用闭合符号替代
- 分号(;) 将两个语句连接在一行中 不提倡
- 冒号(:) 将代码块的头和体分开
- 语句(代码块) 用缩进块的方式体现
- 不同的缩进深度分割不同的代码块
- Python文件以及模块的形式组织
模块:每个Python脚本都是可以被当成模块,模块变得过大,并且驱动太多功能的话,就应该考虑拆一些代码出来构建另一个模块。
变量赋值
- 等号(=)是主要的赋值操作符 (其他的都是增量赋值操作符)
注:
Python赋值是引用传递
Python赋值语句不会返回值 在C语言中成立
x = 1
y = (x = x + 1) # 赋值语句不是合法表达式
y = x = x + 1 # 链式赋值
x += 1 # 增量赋值
x = y = z = 1 # 多重赋值
(x,y,z) = (1,2,'a string') # mul-tuple "多元"赋值
增量赋值相对普通赋值不仅仅是写法的改变,可变对象会被就地修改,不可变对象会重新分配一个对象
多重赋值 上例中一个1的整型对象被创建,该对象的同一个引用被赋值给x,y,z。也就是一个对象赋给了多个变量。
多个变量同时赋值,等号两边都是元组,此处括号建议加上
# Python中交换值
(x,y) = (1,2)
(x,y) = (y,x)
- 标识符
作为名字的有效字符集合 关键字 保留字
合法的Python标识符 同C语言
- 专用下划线标识符
_xxx 不用 ‘from module import *' 导入
_xxx_ 系统定义名字
_xxx 类中私有变量 注意这点
基本风格指南
- 注释 简洁、优雅、准确
- 文档 __doc__ obj.__doc__ 访问第一个没有赋值的字符串 用的很少
- 缩进 注意tab和空格保持其中一种一致 建议使用空格 不同编辑器tab可能不一致
小技巧:通过先使用tab后统一将tab转为空格
import this
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Python之禅
- Python模块结构和布局
# !/usr/bin/python --> 无需直接调用解释器,输入脚本名字即可执行
# -*- coding: utf-8 -*- --> module.__doc__ 访问
# __author__: reworld
# (1) 起始行 ⬆
#(2)模块文档
'''this is a templete module'''
# (3) 模块导入
import sys
import os
# (4) (全局)变量定义
debug = True # 除非必须 尽量使用局部变量代替全局变量 易维护节约内存
# (5) 类定义(若有)
class FooClass(object):
"Foo Class" # class.__doc__ 模块被导入时
pass
# (6) 函数定义(若有)
def test():
"test function" # function.__doc__
foo = FooClass()
if debug:
print("ran test()")
pass
# (7) 主程序
if __name__ == "__main__":
test() # 通常调用main函数
所有的模块都有能力执行代码,那些没有代码缩进的代码行,在模块被导入时就会执行,除了那些真正需要执行的代码以外,几乎所有的功能代码都在函数当中。
通常只有主程序模块中有大量的顶级可执行代码,所有其他被导入模块应该只有很少的顶级执行代码,所有的功能代码都应该封装在函数或类当中
__name__ 指示模块如何被加载
- 如果模块是被导入 __name__ 的值是模块的名字
- 如果模块是直接被执行的 __name__的值是 ‘__main'
- 单元测试
内存管理
- 变量无须事先声明
- 变量无须指定类型
- 开发者不用关心内存管理
- 变量名会被回收
- del语句能够直接释放资源
- 变量定义
x = 4
print(x)
- 动态类型
解释器根据语法和右侧的操作数决定新对象的类型
- 引用计数
- del语句
del obj1[,obj2[,...bojN]]
Python程序
# coding=utf-8
# !/usr/bin/python
'makeTextFile.py -- create text file'
import os
ls = os.linesep # 本地变量别名
fname = raw_input("\nplease input filename\n")
all = []
print("\nEnter lines ('.' by itself to quit).\n")
while True:
entry = raw_input(">")
if entry == '.':
break
else:
all.append(entry)
fobj = open(fname,'w')
fobj.writelines(['%s%s' % (x, ls) for x in all])
fobj.close()
print('DONE')
# !/usr/bin/python
# -*- coding: utf-8 -*-
# __author__: reworld
'readTextFile.py -- read and display text file'
fname = raw_input('Enter filename:')
print()
# try-except-else用法
try:
fobj = open(fname,'r')
except IOError, e:
# 文件不存在已经包含在该异常内
# TODO 如何做文件名打印 file:%s
print("*** file open error:", e)
else: # 此处else用法
for eachLine in fobj:
print(eachLine)
fobj.close()
相关模块和开发工具
调试器:pdb
记录器:logging
性能测试器:profile、hotshot、cProfile
补充:性能测试工具 skyworking类似 待做Demo
Python对象
身份:每一个对象都有一个唯一的身份标识自己,内建函数id()
来得到。
类型:对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么的样打的规则。内建函数type()
查看对象类型。
值:对象表示的数据项
基本数据类型
- 数字
- Integer 整型
- Boolean 布尔型
- Long interger 长整型
- Floating point real number 浮点型
- Complex number 复数型
- String 字符串
- List 列表
- Tuple 元组
- Dictornary 字典
所有标准对象(基本数据类型都可以用于布尔测试)
其他内建类型
- 类型
- Null对象(None)
- 文件
- 集合/固定集合
- 函数/方法
- 模块
- 类
类型对象和type类型对象
对象的一系列固有行为和特性(比如支持哪些运算,具有哪些方法)必须事先定义好。
类型正是保存这些信息的最佳位置。
# 内建函数type()
type(42)
<type 'int'> # 类型对象
type(type(42))
<type 'type'>
所有类型对象的类型都是type,它是所有Python类型的根和所有Python标准类的默认元类
从Python2.2中类型统一,类就是类型,实例就是对应类型的对象
None—Python的Null对象
None没什么有用的属性,它的布尔值是false。
内部类型
- 代码
- 帧
- 跟踪记录
- 切片 —> 重点
- 省略
- Xrange
- 代码对象
# 编译过的Python源代码片段,是可执行对象
compile() exec() eval()
- 帧对象
跟踪记录对象
- 跟踪记录对象
- 切片对象
# !/usr/bin/python
# -*- coding: utf-8 -*-
# __author__: reworld
if __name__ == "__main__":
foo_str = 'abcde'
# 语法sequence[起始索引:结束索引:步进值]
print(foo_str[::-1])
# edcba
print(foo_str[::-2])
# eca
- 省略对象
省略对象用于扩展切片语法,起记号作用。这个对象在切片语法表示省略号。sequence[...,start:end]
- XRange对象
调用内建函数xrange()
会生成一个Xrange对象,xrange()
是内建函数range()
的兄弟版本,用于需要节省内存使用或range()
无法完成的超大数据集合。
标准类型操作符
对象值比较
比较操作符用来判断同类型的对象是否相等,所有内建类型均支持比较运算。返回布尔值。
# !/usr/bin/python
# -*- coding: utf-8 -*-
# __author__: reworld
if __name__ == "__main__":
# 数值类型根据数值的大小和符号比较,字符串按照字符序列值进行比较
print(2 == 2)
print(2.46 <= 2)
# print(5+4j < 2 -3j) 报错
print([3, 'abc'] == ['abc', 3])
# 多个比较操作放在同一行进行,求值顺序从左到右
print(3 < 4 < 5)
print(3 > 2 > 5 !=2)
对象的值在比较而非对象本身
对象身份比较
foo1 = 4.3
foo2 = foo1
foo3 = 4.3
foo4 = 1 + 3.3
print(id(foo1),id(foo2),id(foo3),id(foo4))
a is b ==> id(a) == id(b) # 同一个对象
a is not b # 不是同一个对象
# (140480586453024, 140480586453024, 140480586453024, 140480584254600)
foo5 = 1
foo6 = 1
if (foo5 is foo6):
print("same obj")
else:
print("diff obj")
# same obj
整型对象和字符串对象是不可变对象,所以Python会很高效缓存它们,造成我们以为Python应该新对象时,它却没有创建对象的假象
布尔类型
not and or 优先级 not > and > or
标准内建函数
函数 | 功能 |
---|---|
cmp(obj1,obj2) | 比较obj1和obj2 |
repr(obj)或`obj`(不建议) | 返回一个对象的字符串表示 |
str(obj) | 返回对象适合可读性好的字符串表示 |
type(obj) | 得到一个对象的类型,返回相应的type对象 |
repr()输出对Python比较友好,str()输出对用户比较友好
- type()
# !/usr/bin/python
# -*- coding: utf-8 -*-
# __author__: reworld
if __name__ == "__main__":
print(type(""))
print(type(100))
print(type(1.0))
print(type([]))
print(type(()))
print(type({}))
print(type(type))
class Foo: pass
foo = Foo()
print(type(Foo))
print(type(foo))
class Bar(object):pass
bar = Bar()
print(type(Bar),type(bar))
<type 'str'>
<type 'int'>
<type 'float'>
<type 'list'>
<type 'tuple'>
<type 'dict'>
<type 'type'>
<type 'classobj'>
<type 'instance'>
(<type 'type'>, <class '__main__.Bar'>) -- > 注意此处结果
- isinstance()
# !/usr/bin/python
# -*- coding: utf-8 -*-
# __author__: reworld
"""check num type"""
def checkNumType(num):
print num,"is",
if isinstance(num, (int, long, float, complex)):
print 'a number of type:', type(num).__name__
else:
print 'not a number at all!'
if __name__ == "__main__":
checkNumType(5)
Python类型操作符和内建函数总结
类型工厂函数
原来所谓的内建函数转换函数,例如int(),type(),list()现在都成了工厂函数。虽然看上去有点像函数,实际上是类。调用它们的时候,实际生成该类型的一个实例,就像工厂生产货物一样。
- int(), long(), float(), complex()
- str(), unicode(), basestring()
- list(),tuple()
- type()
- dict()
- bool()
- set(), frozenset()
- object()
- classmethod()
- staticmenthod()
- super()
- property()
- file()
标准类型的分类
标准类型:Python的"基本内建数据对象原始类型"
- 基本 这些类型都是Python提供的标准或核心类型
- 内建 这些类型都是Python默认提供的
- 数据 因为它们一般是数据存储的
- 对象 因为对象是数据和功能的默认抽象
- 原始 因为这些类型是提供最底层的粒度数据存储
- 类型 因为它们就是数据类型
三种模型
- 存储模型
- 一个能保存单个字面对象的类型,我们称之为原子或标量存储
- 容纳多个对象类型 容器存储
分类 | Python类型 |
---|---|
标量/原子类型 | 数值(所有数值类型),字符串(全部是文字) |
容器类型 | 列表、元组、字典 |
- 更新模型
- 某些类型允许它们的值进行更新(对象的身份),而另一些则不允许
分类 | Python类型 |
---|---|
可变类型 | 列表,字典 |
不可变类型 | 数字、字符串、元组 |
- 访问模型
- 三种访问方式 直接存取、顺序、映射
分类 | Python类型 |
---|---|
直接访问 | 数字 |
顺序访问 | 字符串、列表、元组 |
映射访问 | 字典 |
- 标准类型分类