一日内完成python学习

自己更喜欢用一整块时间来沉浸式整理学习资料,所有创建”ONEDAY”专题,争取利用24小时,或者更短时间来完成一个知识的系统性学习和总结。
python的基础知识都已经了解,并且已经开始应用,今天的任务是参考进行廖雪峰的学习教程文档进行整合学习,针对薄弱知识点进行练习。

现在是九点二十二分,开始打开教程。教程有python3和python2.7两个版本,选择3版本。

简介

“你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的JavaScript语言”提到几个典型语言。
用Python可以做什么?
可以做日常任务,比如自动备份你的MP3;可以做网站,很多著名的网站包括YouTube就是Python写的;可以做网络游戏的后台,很多在线游戏的后台都是Python开发的。总之就是能干很多很多事啦。

Python当然也有不能干的事情:
比如写操作系统,这个只能用C语言写;写手机应用,只能用Swift/Objective-C(针对iPhone)和Java(针对Android);写3D游戏,最好用C或C++。

优缺点,安装等问题老生常谈,此处略过。
目前电脑双系统,主要用linux使用python。
win下用anaconda3。
安装教程

python基本介绍

强调:

  1. 代码要一个一个自己打。
  2. 注意大小写和缩进。
    数据类型:整型,浮点型,字符串(中间提到科学计数法e,和转义字符“/”)
    Python还允许用r’’表示’’内部的字符串默认不转义,
    关于那个声明“coding:utf-8”:
    Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题,但是如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
    本着节约的精神,才出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

输出格式化的字符串(字符串输出的部分内容用%去引用外部)外部样式%(one,two,…)
%s表示用字符串替换,%d表示用整数替换,%f是浮点,(%2f指定小数位数)

list是一个可变的有序表[‘钢铁’,’蜘蛛’,’美国’,’绿巨’,’奇异’]
name.append(‘黑豹’)末尾增加
name.insert(3,’银河’)3位置插入
name.pop(3)3位置被删除,不写数字就删除末尾
tuple元祖(’雅典娜’,’星’,’龙’,’瞬’,’冰’,’辉’)
他们出现就不可以被修改。

dict字典d={‘流川枫’:11,’樱木’:16,’me’:0}
修改d[‘樱木’:10]
删除d.pop(’me’)
set和dict的唯一区别仅在于没有存储对应的value

函数

调用内置函数:
abs(-100)取绝对值
hex()转16进制

自定义函数:
`def name():

`。
`return()

调用函数:外部文件里的 from 文件名(无.py后缀) import name

Python的函数返回多值其实就是返回一个tuple,多个变量可以同时接收一个tuple,按位置赋给对应的值.

定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum

>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84

def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum


>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84

Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去
关键字参数可以先组装dict,再通过kw传入:func({‘a’: 1, ‘b’: 2})

1
2
3
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

高级特征

list或tuple的部分取出:切片操作
取前十个:L[:10]
去后十个:L[:-10]
每5个取一个:L[::5]

列表生成器:
生成[1x1, 2x2, 3x3, …, 10x10]
‘’’
[x*x for x in range(1,10)]

生成器generator

循环的过程中不断推算出后续的元素,不必创建完整的list,从而节省大量的空间。
创建:
1.列表生成式的[]改成(),就创建了一个generator
2.要把print(b)改为yield b (遇到yield输出并中断。)

迭代器Iterator

可以直接作用于for循环的对象统称为可迭代对象:Iterable(list、tuple、dict、set、str、含yield)
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
生成器都是Iterator对象,但list、dict、str等通过使用iter()函数变成Iterator。
可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的

函数式编程

匿名函数:把函数赋值给变量名,通过变量名来调用。
高阶函数:函数里调用函数。

map函数:

1
2
3
4
5
6
>>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。

1
2
3

>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

把这个list所有数字转为字符串,简单实用!

reduce函数:

1
2
3
4
5
6
>>> from functools import reduce
>>> def fn(x, y):
... return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

把序列[1, 3, 5, 7, 9]变换成整数13579。
所以与map相比,reduce是把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

filter函数:

(过滤/筛选“掉”)

1
2
3
4
5
def is_odd(n):
return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

在list中,删掉偶数,只保留奇数。

sorted函数

(整理)

1
2
3
4
5
6
>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]


>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

排序
key作用于每一个元素上

1
2
3
4
5
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

首字母顺序排序(其实是按照ASCII的大小比较)所以代码中转换小写。倒序:reverse=True

返回函数

用于闭包。 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

匿名函数

lambda x: x * x实际上就是:

def f(x):
return x * x
关键字lambda表示匿名函数,冒号前面的x表示函数参数。

1
2
3
4
5
6
7
8
>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25

def build(x, y):
return lambda: x * x + y * y

偏函数

Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。

1
2
3
4
5
6
>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

模块

模块里面的函数名称

正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;

类似xxx这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的authorname就是特殊变量,hello模块定义的文档注释也可以用特殊变量doc访问,我们自己的变量一般不要用这种变量名;

类似_xxx和xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,abc等;

1
2
3
4
5
6
7
8
9
10
11
def _private_1(name):
return 'Hello, %s' % name

def _private_2(name):
return 'Hi, %s' % name

def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)

此模块中,公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:

外部不需要引用的函数全部定义成非公开的private(_xxx),只有外部需要引用的函数才定义为public。

pip安装外部模块,import 使用安装好的模块

OOP:面向对象编程

文章目录
  1. 1. 简介
  2. 2. python基本介绍
  3. 3. 函数
  4. 4. 高级特征
    1. 4.1. 生成器generator
    2. 4.2. 迭代器Iterator
  5. 5. 函数式编程
    1. 5.1. map函数:
    2. 5.2. reduce函数:
    3. 5.3. filter函数:
    4. 5.4. sorted函数
    5. 5.5. 返回函数
    6. 5.6. 匿名函数
    7. 5.7. 偏函数
  6. 6. 模块
    1. 6.1. 模块里面的函数名称
  7. 7. OOP:面向对象编程
,