python小笔记

 

先立个flag:这份笔记是2019-3-26晚8:30左右开始写的,我,坂田银时的第7564568118号老婆,将在下周这个时候,也就是2019-4-2晚8:30学完python

并歃一根秀发为誓(秀发在此——————————————————————————————————)

python小笔记_第1张图片

完全不懂编程的小白可以去看《简明python教程》,有很多基础语法(有基础的看到可能会稍微觉得有点啰嗦),这篇博客是跟着廖雪峰写的python3学习的,适合有一定基础的,因此基础语法比较少

不要用nodpad++的自动缩进的缩进,一定要把自带的缩进删掉,自己打四个空格,学着玩的可以安装vim配合python自带的脚本编译,认真学的可以去安装pycharm附加靠谱的pycharm激活教程(永久激活,网址不能用的话可以去关注微信公众号:裸睡的猪,里面还会更新idea的激活教程),至于安装教程由于有人安装专业版,有人安装社区版,安装的年份也不一样就不推荐了(我知道我写这么细也不会有人看的,尽管我是个国际n线不知名仅有六个粉丝的小博主,但是万一呢,万一有人看了呢)

python小笔记_第2张图片

1.地板除只取整数部分。例如:7.8//2=3.0,10//3=3,10//5=2,10.0//5=2.0

2.Python整数和浮点数没有大小限制,但是超出一定范围会被定义为无限大inf

3.为了避免出现中文乱码应该在开头写

#!/user/bin/env python3    告诉系统这是一个Python可执行程序

#  -*-coding: utf-8 -*-       告诉Python解释器按照utf-8编码读取代码

4.# -*-coding:utf-8 -*-
s=((85.0-72.0)/72.0)*100
print('提升了:%.1f%%'%s)    #这里需要注意%s前面一定不要加‘,’,Python这里是没有逗号的,切记切记

5.list:插入和查找的时间随着list的增加而增加,但是占用空间小

name.[-1] 取最后一个
name.append('string') 在末尾插入
name.insert(int,'string') 在指定位置插入
name.pop(int) int没有的话,默认删除最后一个
name[int]='string' 把指定位置的元素替换
name['string',['string',......],......] list里嵌套list,嵌套的list算一个元素,被嵌套的外层list可以看成是一个二维数组
name.sort() 对list进行排序

6.tuple:跟list很像,但是一旦初始化无法修改。就像c++里的const。无法append,pop等,因为无法修改,所以安全性更高。但是如果tuple指向的是一个可变的,那么就可以修改。,比如t=('string',['string1','string2']),t中的元素1指向了一个list,不能将list变成tuple之类的别的性质的元素,但是可以改变list中元素所指向的值

定义只有一个元素的tuple时要加‘,’消除括号歧义,比如t=(1,)而不能是t=(1)

7.if x:

       print('True')    #只要x是非空字符串非零数字非空list等,结果就为True

8.python没有自增也没有自减,因为python跟别的语言有一点不同,python的模型规定,数值的对象是不可变的,字符串也是不可变的,我的个人理解是,别的语言例如c++,是给变量a一个值,但是Python是从整数池中取出一个值比如5,给5一个代号叫做a。c++中a是boss,5是下属,自增时就是boss换了一个下属跑腿,但是Python中5是boss,a是下属,如果自增,等于换了一个boss。

下面有一个著名的代码:

>>> b = 5
>>> a = 5
>>> id(a)
162334512
>>> id(b)
162334512
>>> a is b
True

 

这个著名的例子中,5是boss,a和b是跑腿小弟,他们隶属一个boss,这样做可以提升性能,但是只有1~256可以做boss,其他数字并不是这样。

9.dict:dict有点类似于结构体, d = {'Michael': 95, 'Bob': 75, 'Tracy': 85},Michael和95是一伙的

key-value的储存方式,一个key只能对应一个value

d={‘sring_key’:value,‘’:,} 初始化
d['stinrg']=value(string未出现过) 插入一个元素,注意dict内部排序与插入顺序无关,例如在一个初始化好了的dict中插入一个key-value,新插入的并不在结尾,也不是按照key的字母排序
d['string'] 查找string对应的value
d['string']=value 对已经存在的string重新赋予value
‘string’ in d string在d中返回true,不在返回false
d.get('string',number) 如果string不在d中,返回自定义的number,不定义number的话默认返回none,也就是什么都没有
d.pop('string') 删除指定的key与其value

dict查找和插入十分方便,但是占用内存大。

10.set:set只有key没有value,set会自动过滤重复的数,set可以存放list

>>> s = set([1, 1, 2, 2, 3, 3])
>>> s

{1, 2, 3}

s.add() s中添加一个key
s.remove() 删除括号中的指定key
s1&s2 对s1和s2取交集
s1|s2 取并集

 

11.http://docs.python.org/3/library/functions.html#a

    python函数查询网址

12.Python没有double但是有float,并且float转化为int时跟c++一样不会有四舍五入,会直接舍弃小数部分。

13.可以给已经存在的函数改名,比如绝对值函数abs()

>>> a = abs      # 变量 a 指向 abs 函数
>>> a(-1)      # 所以也可以通过 a 调用 abs 函数
1

14.函数返回的是一个tuple

15.在编写函数时可以定义默认参数,比如pow可以这样定义pow(a,n)也可以pow(a,n=2)

如果用户只输入一个参数,那么n默认为2

16.默认参数指向不变对象

    def add_end(L=[]):
 L.append('END')
 return L

>>> add_end()
['END']
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

这个例子说明了默认参数指向不变对象

应该做一下修改

def add_end(L=[]):

    if L is None:

        L=[]

    else......

17.函数参数选用:可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这 5 种参数都可以组合使用,除了可变参数无法和命名关键字参数混合。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数

必选参数(位置参数) 一个函数所必须的参数pow(x),x是必选参数
默认参数 设定了默认值的参数叫做默认参数pow(x,n=2),n为默认参数
可变参数 传入的参数个数是可变的, calc(*numbers),*number是可变参数,number接收的是一个tuple,可变参数还可以接受一个list或者tuple,例如:func(*(1, 2, 3)),a=[1,2,3],func(*a)
关键字参数 传入 0 个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个 dict,也就是要传入dict(类似于结构体的那个) person(name, age, **kw),**kw是关键字参数
命名关键字参数

在关键字参数基础上限制关键字参数的名字,也就是只接受指定关键字的参数别的不接受

person(name, age, *, city, job),city和job就是命名关键字,必须在传参时写明关键字,而且调用时不可以漏掉命名关键字参数,除非有默认的参数,这也是和关键字参数不同之处,关键字参数可以没有

18.尾递归优化:

个人理解,普通的递归是一次火车进站,火车头有一个绑匪,他只认识他们组织里他的直属大哥,但是小弟并不清楚这个组织的内幕,因此我们只抓到小弟的话是无法知道这个组织全部的罪行的,我们必须找到大哥大才能知道这个组织全部的罪行,于是为了查清楚这个犯罪团伙的全部罪行,我们要让火车头进站,把这个小弟堵在车站中,然后去小弟说的下一节车厢找他的直属大哥,就这样一层一层的查下去,直到找到了大哥大,大哥大说出了他的罪行,我们就可以开始根据大哥大的罪行给他的小弟们定罪了,我们让火车一层层出站,宣判每一节车厢的小弟犯了什么罪。

但是如果犯罪团伙过大,甚至超过了火车站的最大容量,那么这个方法显然是不行的。

于是我们决定用尾递归来抓那些大型犯罪团伙,我们最终目的是为了给每一个人定罪,并且抓住大哥大,这么看来一切罪恶的根源出在了大哥大身上,因此我们可以先气势汹汹的去找大哥大逼供,大哥大很没出息的招出了他的罪行然后我们带着大哥大去找了最没地位的那个小弟,让火车头进站,定罪小弟后我们让火车头出站,有了小弟的罪行后,再让下一节车厢进入车站,根据小弟的罪行定罪这个小弟的直属大哥,这样一层一层下去,最后,我们只用了火车站一节车厢的容量就揪出了这个犯罪团伙的全部罪行。

这是一个普通的递归:

def fact(n):
     if n==1:
         return 1
     return n * fact(n - 1)

这是尾递归优化后的代码:

def fact(n):

def fact_iter(n,product):       #n是最没地位的小弟,product是这个组织的罪行    return fact_iter(n,1)         #大哥罪行已经掌握,为1,可以开始从最小的小弟n调查了

     if n==1:                           #如果n==1,说明我们已经查完了所有的人,这时的product记录了这个组织的全部罪行

         return product            #可以结束调查了

    return fact_iter(n-1,n*product)     #n!=1说明这个组织还有人,我们先记录下当前小弟的罪行,然后去找这个小弟的直属大哥

 

 

学完是不可能学完的,本来我还不信我很菜,现在信了,原来我真的是一条酸菜鱼,又酸又菜又多余

python小笔记_第3张图片
 

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

20.caplitalize函数

python小笔记_第4张图片

21.del删除,del shout#删除shout函数

22.functools.partial 的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。

23.关于装饰器找到一篇讲的很适合第一次接触装饰器的人看的博客https://blog.csdn.net/qq_42849332/article/details/81453287

内容并不是很全面但是很基础,有利于新手脑壳里形成装饰器的一种大致模型

24.python全体内置函数网址https://docs.python.org/3/library/functions.html

25.

__xxx__ 特殊变量,可以直接引用,但是有特殊用途,不可以随便引用(来者都是客)
 __xxx private,不应该被直接引用(专情且固执)
_xxx 虽然可以外部访问但是请视为私有(得到了人,得不到心)

26.外部不需要引用的函数全部定义成 private,只有外部需要引用的函数才定义为 public。

27.class 后面紧接着是类名,即 Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,跟java不太一样

28.https://docs.python.org/3/library/exceptions.html#exception-hierarchy错误类型和继承关系

你可能感兴趣的:(python小笔记)