运行: python test.py
输出: print(变量); 如print(1+2), print("1+2")
字符串可以用单引号也可以用双引号。单引号包围的字符串可以包含双引号,双引号包含的字符串可以包含单引号。
r'内容' 表示内容里面的\不被转义
'''内容
内容'" 表示可以支持换行的字符串
r和'''可以组合使用。
布尔值 True False注意大小写 and is or not 都是运算符.
None空值
除法: int / int = float; 10 // 3 = 1; -10 // 3 = -4. 下取整. -10 % 3 = 2 余数与符号有关.
Python的整数没有大小限制,而某些语言的整数根据其存储长度是有大小限制的,例如Java对32位整数的范围限制在
-2147483648
-2147483647
。Python的浮点数也没有大小限制,但是超出一定范围就直接表示为
inf
(无限大)
编码: 内存中统一使用Unicode编码. Unicode编码是2或4字节表示一个字符. 写入文件用UTF-8编码, UTF-8是1-6字节, 变长的.
Unicode是用双引号写的字符串, UTF-8等其它编码是类似b"内容"的字符串
ord('A')将字符转int(应该是Unicode), chr(25991)将int转字符(同Unicode)
变成utf-8之后中文字符会占三个字节因为前面多了一个\
'Hi, %s' % True 输出 Hi, True
'Hi, %s is %d years old' % ('xiaoming', 5) 输出 小明5岁了
[类似C#的输出方式]print('Hi, {0}, {1:.3f}'.format(True, 5.201314)) 输出 Hi, True, 5.201
List 有序数组, 变长. 支持append追加到末尾, insert(1, "元素")插入到第一个位置, pop()删除末尾, pop(i)删除第i个元素, a[1] = 'Sarah', 直接替换某元素
list元素可以嵌套
tuple元素, 不可修改.
if <条件判断1>:
<执行1>
elif <条件判断2>:
<执行2>
elif <条件判断3>:
<执行3>
else:
<执行4>
if
判断条件还可以简写,比如写:
if x:
print('True')
只要x
是非零数值、非空字符串、非空list等,就判断为True
,否则为False
。
包含了基本读取 转换为int 和判断
s = input('birth: ')
birth = int(s)
if birth < 2000:
print('00前')
else:
print('00后')
list(range(100))
# range(100)生成一个range类型的对象, 再用本range构造一个list
Dict(映射)
# 创建和访问
d = {"Michael": 95, 'Bob': 75, 'Tracy': 85}
print(d['Michael'])
d['ixs']=25
print(d['ixs'])
要避免key不存在的错误,有两种办法,一是通过in
判断key是否存在:
if 'Key' in d:
二是通过dict提供的get()
方法,如果key不存在,可以返回None
,或者自己指定的value:
#get和中括号访问的区别
d.get('Thomas') # 不存在返回None
d.get('Thomas', -1) # 不存在返回-1
dict占用大量的内存空间, 速度快; list随着元素增加速度变慢, 比较节省空间.
set有序不重复集合, 参见这里.
强制类型转换 int('123'), float("12.34"), str(100), bool(1), bool('')=False
Python函数在定义的时候,默认参数L
的值就被计算出来了. 所以如果默认参数指向了变量,后面对此参数的操作都是对同一个变量的操作
变长参数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
切片(取子数列)是个很常见的操作, 地址>>>
list类型的迭代是很普通的foreach; dict类型的迭代有些特殊, 是
默认情况下,dict迭代的是key。如果要迭代value,可以用
for value in d.values()
,如果要同时迭代key和value,可以用for k, v in d.items()
。
L2 = [x.lower() for x in L if isinstance(x, str)] # 理解为for .. in L: if CONDITION: return ..
把中括号改成小括号就变成迭代器类型了. 迭代器也是Iterable的. 迭代器在访问元素的时候才计算该元素, 所以占内存小.
高阶函数: (在Python 3中好像都是惰性的, 在Python 2中好像不是)
map: 对List的每个元素进行操作, 返回一个List
reduce: 依次对List的前两个元素进行操作, 返回一个数
filter: 对List的每个元素进行判断决定是否保留, 返回一个List
sorted: 对List的元素进行排序, 按照一定规则. 返回一个List
返回函数就是函数作为返回值. 这就是惰性函数的实现方式.
- 注意到返回的函数在其定义内部引用了局部变量
args
,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用, - 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
匿名函数 lambda [参数]: 返回值
装饰器: 重写(override)函数的一种方法. 定义一个以函数为参数的函数, 并返回一个Wrapper函数 wrapper(*args, **kw)
- 最典型的一行代码:
def wrapper(*args, **kw):
偏函数: 为函数的部分参数指定值, 并创建一个指向此函数的变量
在Python中,一个.py文件就称之为一个模块(Module)。
被执行的文件的__name__会被命名为main, 而用Import导入时则不会
安装模块:
我们推荐直接使用Anaconda,这是一个基于Python的数据处理和科学计算平台,它已经内置了许多非常有用的第三方库,我们装上Anaconda,就相当于把数十个第三方模块自动安装好了,非常简单易用。
我现在搞不清的是类与模块在导入时的区别,究竟谁才是主要部分
from 文件名 import 类名
面向对象编程
这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
Python的“file-like object“就是一种鸭子类型。对真正的文件对象,它有一个
read()
方法,返回其内容。但是,许多对象,只要有read()
方法,都被视为“file-like object“。许多函数接收的参数就是“file-like object“,你不一定要传入真正的文件对象,完全可以传入任何实现了read()
方法的对象。
继承一个类用Class Son(Parent): 基类是object注意o小写
type判断一个对象的类型 isintance()可以用于继承关系. 能用type判断的都能用Isinstance()判断
has attr(), getattr(obj, 'z', 默认值) 获取对象信息
python中的类属性像静态成员变量, 属于类不属于对象 但是Python的动态语言特性导致给对象.变量赋值时会给对象增加自身的属性
python的动态语言特性 甚至可以给变量添加方法. 可以用__slot__指定允许的变量
python可以像C#那样设置getter和setter这个东西是@property 和 @变量.setter
>> 已跳过面向对象高级编程中Python的多重继承后面的内容
>> 继续单元测试