1 当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
# !/user/bin/env python3
# -*- coding:utf-8 -*-
第一行注释是为了告诉linux/os系统,这是个python可执行程序,windows系统会忽略
第二行注释是为了告诉python解释器,按照UTF-8编码读源代码,否则中文可能会乱码
2 格式化输出:
%(a,b,c)
{0}{1:.1f}.format(a,b)
3 可以通过append追加元素在列表末尾,通过pop弹出最后一个元素,在pop里放数字弹出对应key的数
tuple 对于单个元素的元组,可以通过(1,)来消除歧义
4 条件语句:
if clause:
pass
elif clasuse:
pass
else:
pass
5 python内置字典dict在其他语言中成为map,使用key-value存储,具有极快的查找速度
通过dict提供的get)方法,如果key不存在,返回None或者自己指定的值;删除一个key使用pop(key)
对应的value也会被删除
dict 有以下几个特点:
1)查找和插入的速度极快,不会随着key的增加而变慢
2)需要占用大量的内存,内存浪费多
list有以下特点:
1)查找和插入的时间随着元素的增加而增加
2)占用空间小,内存浪费多
set和dict类似,也是一组key集合,但是不存储value,但是它没有重复的key,通过add(key)方法可以增加元素到
set中,通过remove(key)方法删除元素,set不可以放入可变对象,因为无法判断两个可变对象是否相等
6 空函数
def nop():
pass
函数返回多个值其实是返回一个tuple
位置参数:最普通的参数,
默认参数:a=10,必选参数在前,默认参数在后,否则解释器会报错。当有多个参数时,把变化大的参数放在前面,
变化小的参数放在后面,变化小的参数就可以作为默认参数。默认参数降低了函数调用的难度,而需要更复杂的
调用时,又可以传递更多的参数来实现
可变参数:*args。可以传入0个、一个以上的参数,或者元组和列表
关键字参数:**kargs,可以传入字典,对于关键字参数,可以传入不受限制的数量,到底传入了什么参数就要在函数
内部检查了,如果要限制关键字参数的名字,就可以使用命名关键字参数,这种的定义方式如下,在*后面写变量名
def person(name,*,city):
pass
调用方式是person('Jack',city='beijing')
如果函数中已经有一个可变参数,就不需要特殊分割符号*了,比如
def person(name,*args,city)
命名关键字参数具有默认值时,可不传入值,比如:
def person(name,age,*,city='beijing',job):
pass
person('jack',24,job='engineer')
位置参数,默认参数,可变参数,关键字参数和命名关键字参数,这五种组合都可以使用
def func(a,b=0,*args,**kargs):pass
def func(a,b=0,*,c,**kargs):pass
def func(a,b=0,*args,c,**kargs):pass
7 如果一个函数在内部调用自身,则它就是递归函数。递归的优点是逻辑清晰,缺点是占用内存,
要防止栈溢出,解决递归缺点的方法是通过尾递归优化。
尾递归是指函数返回的时候调用自身,并且return语句不能包含表达式,这样解释器就可以把尾递归
做优化,使递归本身无论调用多少次,都占用一个栈帧,不会出现栈溢出的情况
遗憾的是大多数编程语言没有对尾递归做优化,所以即使写成尾递归形式,也会导致溢出。
8 列表切片操作:
前三个元素:L[0:3]
倒数第一个元素的索引L[-1]
后十个数索引 L[-10:]
前十个数,每两个取一个 l[ :10:2]
所有的数,每5个取一个 l[ ::5]
tuple 也是一种list,唯一区别是tuple不可变,字符串也是一种list,可以切片
9 for in,迭代
for key in dict.keys() 迭代键
for value in dict.values() 迭代值
for k,v in dict.items() 迭代键值
10 列表生成式
list(range(1,11))
[x*x for x in range(1,11)]
[x*x for x in range(1,11) if x%2 ==0] 用if语句筛选
[m+n for m in range(1,11) for n in range(1,11)]
11 生成器
生成器即一边循环一边计算的机制。生成方法有:
1)将列表加()生成,
2)直接在()用列表生成式生成
3)使用yield关键字
12 迭代器
直接作用于for循环的数据类型有以下几种:
1)集合数据类型,如list、tuple、dict、set、str
2)生成器
13 函数式编程
变量可以指向函数,函数名也可以是变量,函数参数可以接收另一个函数作参数即成为了高阶函数
14 map/reduce
由于map接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到
序列的每一个元素并将结果作为新的Iterator返回。Iterator是惰性序列,因此通过list()函数把整个
序列都计算出来并返回一个list
reduce(f,list) 稍微复杂一点,先取够f需要的参数,然后然函数调用的结果作为第一个参数,继续
在list中取够它所需要的参数,比如:
>>> from functools import reduce
>>> def fn(x, y):
... return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579
filter(f,list),f作为筛选条件,将list中符合条件的筛选出来 。它也是一个迭代器,惰性序列,需要list()获得结果
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
sorted() 函数也是一个高阶函数,它可以接收一个key函数 实现自定义的绝对值大小排序
15 函数作为返回值
在函数A中定义了函数b,且函数b引用了外部函数a的参数和局部变量,当函数a返回函数b时
,相关参数和变量都保存在返回的函数中,这种称为闭包
16 匿名函数
只能有一个表达式,不能写return,好处:因为没名字,不用担心命名冲突
17 装饰器
在代码运行期间动态增加功能的方式,本质上是一以函数为参数,并返回函数的高阶函数。如果
decorator本身需要传入参数,那就需要写一个返回decorator的高阶函数,写出来更复杂
18 偏函数
使用functools。partial作用就是,把一个函数的某些参数给固定住,返回一个新的函数
19 模块
python引入了目录来组织模块,称为package。
自己创建模块时要注意命名,不要和系统的冲突,否则无法导入
作用域
_a
__a
__a__
安装第三方模块,pip3,可以使用anaconda它集成了很多第三方包
默认情况下,python解释器会搜索当前目录,所有已安装的内置模块和第三方模块,
搜索路径放在sys模块的path变量中,如果要自己添加自己的搜索目录,有两种方法
一是直接修改sys.path.append(path)添加要搜索的目录,这种方法在运行时修改,运行结束后失效
二是设置环境变量PYTHONPATH,该环境变量的内容被自动添加到模块的搜索路径中,设置方式
和path环境变量类似。
20 面向对象编程OOP
实例的访问限制,外部代码可以自由地修改一个实例的变量,如果要让一个内部变量不被外部访问
,可以把变量的名称前加上两个下划线__,则变量就成为一个私有变量,只有内部可以访问,
然后如果外部代码要获取其变量代表的属性,那么可以给student类增加get_name和get_score方法
如果要允许外部修改score,则可以给类增加set_score方法。 需要注意的是在python中,以双下划线 开始和双下划线结束的是特殊变量,特殊变量时可以直接访问的,
python中__name__,__score__