Python 学习札记(二)

Python入门指南

一、python中字符串
1. python的字符串可以通过 + 操作符连接,可以通过 * 操作符重复。
2. 可以被截取。字符串的第一个字符索引为0。可以用切片操作区截取字符串。
3. 不同于C字符串,python字符串是不可变的。向某一个文本索引赋值会引发错误。

二、python函数的定义
1. 函数的参数可以带有默认值。  但是默认值参数只会被赋值一次。 下面是两个例子
def foo(a, L=[]):
    print(L)
    L.append(a)
    return L
#这种方式,函数在每次调用时使用默认参数值的话,参数L是积累的。
def foo(a, L=None):
    print(L)
    if L is None:
        L = []
        L.append(a)
    return L
#这种方式,避免了参数L的积累
2. 位置参数和  关键字参数  (必选参数和可选参数)
函数在调用时,必选参数必须传入实参,而可选参数可以传入实参或者使用默认值。
所以参数列表必须先书写位置参数,然后才是关键字参数。
3. 引入一个形如  **name 的参数时,他表示接受一个dict,该字典包含了所有未出现在形式参数列表中的关键字参数。
4. 引入一个形式  *name 的参数时,他表示接受一个元组,  包含了所有没有出现在形式参数列表中的参数值。
5. 可变参数列表。
def foo(baz, jug, *args):
        pass
这些参数通常被包装进一个元组。通常可变参数时参数列表中的最后一个,所以在可变参数之后的参数都是关键字参数。
6. 参数列表的分拆
*args将一个列表拆开。**args将一个字典拆开。

三、Lambda形式
类似于函数式编程语言,创建短小的匿名函数,并返回这个函数。lambda中可以使用外部作用域的变量。
s = lambda a: a+1
s(1)

四、文档字符串
def foo():
    """Do nothing, but document it.

    No, really, it doesn't do anything.
    """
    pass
调用foo.__doc__

五、列表List
1. 常用函数append,extend,insert,remove,pop,index,count,sort,reverse
2. 列表推导式 [x**2 for x in range(10)]
3. del语句。可以从list中删除切片或者清空整个list

六、元组Tuple
1. 元组是不可变的。
2. (1,)表示一个只含有一个元素的元组,()表示不含有元素的元组
3. 元组的封装和拆封
t = 12345, 54321, 'hello!'
x, y, z = t

七、集合Set
1. 集合是一个无序不重复元素的集。
2. 支持一些交、差、并等计算
3. set()用来创建空集合。注意,不能使用{}
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
basket输出结果为{'orange', 'banana', 'pear', 'apple'},其中过滤了重复元素。
4. 集合也有类似list的推导式。
{x for x in 'abracadabra' if x not in 'abc'} ===> {'r', 'd'}

八、字典Dict
1. dict是无序的键值对。
2. dict()构造函数可以直接从key-value对中创建字典
dict((('sape', 4139), ('guido', 4127), ('jack', 4098)))或者
dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])或者
dict(sape=4139, guido=4127, jack=4098)
3. 字典推导式可以从任意的键值表达式中创建字典
{x: x**2 for x in (2, 3, 6)}

九、几种数据结构的循环技巧
1.
knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
    print(k, v)
2.
for i, v in enumerate(['tic', 'tac', 'toc']):
    print(i, v)
3. 要循环两个或者更多的序列,可以使用zip()整体打包
questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
     print('What is your {0}?  It is {1}.'.format(q, a))
4. 需要逆向循环序列的话,需要先正想定位序列,然后调用reversed()
for i in reversed(range(1, 10, 2)):
    print(i)
5. 需要按照排序后的顺序循环序列,需要使用sorted函数。它不会改动原序列,而是会生成一个新的已经排序好的序列。
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for f in sorted(set(basket)):
     print(f)

十、深入条件控制
1. 逻辑操作符and和or,也称短路操作符。它们的参数从左到右解析,一旦结果可以确定就停止。当其作用于一个普通的非逻辑值时,短路操作符返回的值通常是最后一个变量。
eg: '' or 'abc' or 'gg'
原理: 前一个参数为真,and操作符才会去解析后面的参数;前一个参数为假,or操作符才会去解析后一个参数.

十一、模块
1. dir()函数
按照模块名搜索模块定义。它返回一个字符串类型的存储列表。
如果不传入参数,则返回当前定义的命名。
dir()不能列出内置函数和变量名。
2. 包的概念
import ...
from ... import ...

十二、格式化输出
1. str(),repr(),format()
2. 文件读写,open(filename, mode)返回文件对象
3. 文件对象方法:
read, readline, readlines(返回一个列表,包含了文件中所有的数据行)
tell,seek, close;
4. with处理文件对象,文件使用之后,自动关闭。
with open('filepath', 'r') as f:
        read_data = f.read()
f.close()
5. pickle模块。将任何python对象封装成字符串,写入文件。可以从字符串表达出重新构造对象(拆分)
eg: x为要存储对象,f为文件对象
pickle.dump(x, f)
x = pickle.load(f)

十三、错误和异常
1. 异常处理try: ... except XXX: ...
2. try语句块还可以带上else分支
3. raise分支
4. 自定义异常
5. 清理行为, finally子句不管有没有截获异常都会执行。

十四、类
1.作用域与命名空间
局部命名空间=>中层作用域=>最外层的作用域(包含内置命名)
python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量
2.global及nonlocal
global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。
nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
3.继承,也支持多继承
有两个函数,isinstance(obj, class) 如果obj是class的实例对象,则放回True
issubclass(sub, super) 如果sub是super的子类,则返回True
4.可以用一个空的类定义,实现一个类似结构体或者js对象的数据项集合。
5.异常也是类。注意:抛出的异常类型可以except子句的异常,也可以是其子类。
6.迭代器,只要类中重写内置方法__iter__()和__next__(),eg:
class Reverse:
    def __init__(self, data):
        self.data = data
        self.index = len(data)
    def __iter__(self):
        return self
    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index -= 1;
        return self.data[self.index]
rev = Reverse('test')
for c in rev:
    print(c)
#结果为t s e t
7.生成器
yield

十五、......

你可能感兴趣的:(python,学习笔记)