Python学习简记

1、def approximate_size(size, a_kilobyte_is_1024_bytes=True):
函数声明以def开头;不指定返回值(返回renturn语句中的值,或者空值);参数不必指定类型,自动追踪;调用函数时,参数顺序无关,但若某参数出现参数名,其后参数也必须出现参数名approximate_size(size=4000, a_kilobyte_is_1024_bytes=False) 。勤加使用docstring ''' '''。

2、import sys sys.path sys.path.insert

3、一切都是对象,一切都是first-class object(指可以在执行期创造并作为参数传递给其他函数或存入一个变量的实体)。

4、使用回车符分割语句,使用冒号和锁紧分割代码块;完全空白行不计入。

5、raise语句抛出异常,异常用类来实现,示例中使用字符串创建一个ValueError类的实例。
if size < 0:
    raise ValueError('number must be non-negative')
try...except 块来处理异常
try:
   import chardet
except ImportError:
   chardet = None

6、变量无需声明可以直接赋值,但不可声明后未赋值便引用。

7、小数点用以区分int和float。int强制转化是真正取整(截断)函数,而非floor函数,int(2.5)为2,int(-2.5)为-2。float精确到小数点后15位,int可以任意大,python3不含long。

8、/ 执行浮点除法,即使分子分母都是int也返回float。// 执行古怪的整数除法,返回值可视为floor函数,11//2 为5,-11//2 为-6;分子或分母为float,仍按照上述规则取整但返回float。** 幂运算,% 取余。

9、有fraction(分数)类型。Fraction(1, 3)代表三分之一。Fraction(0, n)为False,其他所有分数为True。float 0 需小心;Python 将测试 0.0000000000001 而不是 0。

10、列表类似于ArraList数组,可以容纳任何对象,可以动态扩展。创建:a_list=[0, 'a', [1, 3]]。添加项: +连接两个列表;append()向末尾添加任意元素;extend()扩展列表;insert()按照索引插入元素。检索:count()计数;index()返回某值的索引。删除:del删除某索引的元素;remove()删除某值的第一个元素;pop()弹出特定索引的元素或最后一个元素。在布尔类型上下文环境中,空列表为假值。


11、元组是不可变的列表,元组比列表速度更快,a_tuple=('a','b','c')。创建但元素元组,需要在值之后加一个逗号,a_tuple=(False,),否则会假定只是额外的括号。赋多值
,(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)。使用list() cuple(),可在元组与列表之间相互转换。


12、集合装有独特的无序的值。a_set={2, 1, 4},空集合需要 a_set=set(),{}表示空字典。修改集合:add()接受单值插入,update()接受集合并将集合中元素插入。删除:discard() remove pop()弹出任意一个元素。集合间操作:union()并集;intersection()交集;difference()差集;symmetric_difference()只在一个集合中出现的元素;除差集外,操作都是对称的。

13、字典,Python针对查找值进行了优化。a_dict = {'server': 'db.diveintopython3.org', 'database': 'mysql'} 。可直接通过键对字典进行修改。值可以是任何类型,键可以是字符串、证书和其他一些类型。

14、None 空值,特殊常量。与其他任何值比较将返回False。

------------------------------------------------------------

1、os.getcwd()获取当前工作路径,os.chdir()更改路径。
处理目录与文件名os.path模块。
os.path.join()从一个或多个路径片段中构造一个路径名,os.path.expanduser('`')获取当前用户Home目录。
(dirname, filename) = os.path.split(pathname)分割完整路径并返回目录和文件名,os.path.splitext()分割文件名返回短文件名和后缀。
glob使用通配分返回符合要求的文件名glob.glob('examples/*.xml')。
os.stat()获取文件元信息。
os.path.realpath()构造绝对路径。

2、列表解析 [elem * 2 for elem in a_list] 过滤解析 [elem * 2 for elem in a_list if elem > 20]
表达式可以任意复杂,甚至调用函数或模块

3、字典解析 metadata_dict = {f:os.stat(f) for f in glob.glob('*')}

4、集合解析 {x ** 2 for x in a_set} 集合解析的输入不一定要是集合,可以使任何序列 {x ** 2 for x in range(10)}

---------------------------------------------------------------

1、Python3采用Unicode编码。
2、'{0:.1f} {1}'.format(size, suffix)。格式化字符串,冒号表示格式说明符的开始。
3、"{0[0]}的密码是 {1[0]}".format(name, passwd) 如果name是列表的话。类似的,也可是是字典、模块、类的实例等。
4、splitlines() split() 分片:s[1:15]

---------------------------------------------------------------

1、字节bytes。by = b'abcd\x65'。字节不可通过下标重新赋值。通过bytearray()转为bytearray就可以通过下标修改了。by.decoding('ascii')将字节按照ascii码方式解释为字符串,string.encode('utf-8')将字符串以utf8编码为字节。

----------------------------------------------------------------

1、正则表达式。
import re; re.sub('ROAD$', 'RD.', s); pattern = '^M?M?M?$'; re.search(pattern, 'M'); pattern = '^M{0,3}$'。
2、松散正则表达式。使用松散正则表达式后,需用re.VERBOSE模式以紧凑形式解析。
3、^ 匹配字符串开始位置;$结束;\b单词边界;\d数字;\D非数字;x?0个或者1个x字符;x*0个或更多的x;x+1个或者更多x;x{n,m}n到m个x;(a|b|c)单独的任意一个a或者b或者c;(x)一个组,记忆匹配到的字符串,可用re.search返回的匹配对象的groups()函数来获取到匹配的值。
4、re.sub('([^aeiou])y$', r'\1ies', 'vacancy')运行结果为vacancies。\1表示记住的第一个分组,该示例中为c,用c代替c,用ies代替y。

--------------------------------------------------------------

1、一切是对象,包括函数。所以可以定义rules = ((a1, a2), (b1, b2))是函数对的序列,可用 for fun1, fun2 in rules: …… 来调用,a1等不是函数名而是真实的函数。
2、def double_fun(m,n):
def a(m, k):
def b(n);
return (a, b)
调用double_fun函数将返回一个元组,该元组由函数a和b组成,分别使用m与n为参数。使用了闭合技术,通过外部函数中定义的变量来动态创建两个函数。
3、with open('plural4-rules.txt', encoding='utf-8') as pattern_file: 
with语句创建context(上下文),open打开文件并返回一个文件对象,当with语句块结束时,python将自动关闭文件。
4、生成器(generator)。含有yield的函数被当作生成器,函数运行至yield语句时暂停,并返回表达式的值,通过next()函数唤醒继续执行。for循环中自动执行next()。
def f():
x = 0
while True:
yield x
x = x + 1
c = f() // 
c //
next(c) // 0
next(c) // 1

------------------------------------------------------------------

1、类。
class Fib:                                        ①
    def __init__(self, max):                      ②
        self.max = max

    def __iter__(self):                           ③
        self.a = 0
        self.b = 1
        return self

    def __next__(self):                           ④
        fib = self.a
        if fib > self.max:
            raise StopIteration                   ⑤
        self.a, self.b = self.b, self.a + self.b
        return fib                                ⑥

__init__()类似于构造函数,第一个被定义,实例中第一个被执行,但却不是,因为__int__()调用时对象已经被创建了。
迭代器是一个定义了__iter__()方法的类。__iter__()方法能返回任何实现了__next__()方法的对象。
__next__()方法会抛出StopIteration异常,并非错误而是迭代用完的信号。
for循环会自动调用iter(),病循环调用next(),自动出来抛出的StopIteration异常。

2、re.findall('[0-9]+', string)。‘-’.join(words)。assert 1 == 2, '断言错误抛出异常'。

3、gen = (c for c in alist)。生成器表达式,类似列表解析,但用的是()而不是[],返回迭代器。与列表解析可节省cpu与ram。如果构造列表目的仅仅是传递给其他函数,可用生成器表达式代替。tuple(ord(c) for c in alist)可迭代所有值病返回元组。ord()返回字符的ascii码。

-----------------------------------------------------------------

1、eval(),通用求值工具。eval('1+1 == 2') 返回True;eval('"A" + "B"')返回'AB';eval("pow(x, 2)")返回25。
2、eval("x*5", {}, {}) 第二第三个参数作为求职表达式的全局和局部名字空间的角色,实例中为空,故求x*5时在全局和本地都没有变量x,会报错。eval("x*5", {"x":x}, {})则可以。

------------------------------------------------------------------

1、a_file = open('examples/chinese.txt', encoding='utf-8')
a_file.read() a_file.close() a_file.closed a_file.read(n) a_file.seek(0) a_file.tell() 。
with open('examples/chinese.txt', encoding='utf-8') as a_file:...
for a_line in a_file:...
a_file.write(string.encoding('utf-8'))可通过这种方式将字符串写入二进制文件。
2、a_file = io.StringIO(a_string) 另有io.ByteIO等。
3、含有__enter__() __exit__()的类变作上下文管理器。
class RedirectStdoutTo:
    def __init__(self, out_new):
        self.out_new = out_new
    def __enter__(self): 
        self.out_old = sys.stdout
        sys.stdout = self.out_new
    def __exit__(self, *args): 
        sys.stdout = self.out_old
with open('out.log', mode='w', encoding='utf-8') as a_file, RedirectStdoutTo(a_file):
    print('B')
将会将B输入到a_file中

----------------------------------------------------------------

1、序列化。python使用pickle模块,其工作对象是数据结构。
pickle.dump(entry, file) 将某个对象序列化(化成字节)并写入file中。
entry = pickle.load(file) 从文件中读取并转换成对象。
b = pickle.dumps(entry) dumps()不保存到文件中,而是简单的返回序列化的数据
entry = pickle.loads(b) 将序列化的数据转为对象。
2、跨平台json,文本格式。json.dump() json.load()。
3、json模块缺少python 中的元组、字节串类型。可自定义扩展接口。
def to_json(python_object):                                           
    if isinstance(python_object, bytes):                              
        return {'__class__': 'bytes',
                '__value__': list(python_object)}                     
    raise TypeError(repr(python_object) + ' is not JSON erializable') 

with open('entry.json', 'w', encoding='utf-8') as f:                   json.dump(entry, f, default=to_json)    
 
建立转换函数,以字典方式存储字节,含有两个键值对,一个表示类别,一个表示实际的值,实际值用sacii的列表来表示字节。然后将函数传递给json.dump()方法的default参数。

解析时,同样自定义函数。
def from_json(object):
if '__class__' in object:
if object['__class__'] == 'bytes':
return bytes(object['__value__'])
return object

with open('basic.json', 'r', encoding='utf-8') as f:
xueer = json.load(f, object_hook=from_json)

------------------------------------------------------------------

1、为python安装类库。
(1)exe直接安装
(2)手动安装。进入类库目录,python setup.py install
(3)包安装--egg
需要包管理器,python3下如distribute。如(2)安装distribute。
进入命令行 ../python3/Scripts/easy_intall.exe ...egg。
python2.X可用setuptools,但不支持python3。

你可能感兴趣的:(编程基础)