基础篇
-
路径基础:
“/”:表示根目录,在windows系统下表示某个盘的根目录,如“E:\”;
“./”:表示当前目录;(表示当前目录时,也可以去掉“./”,直接写文件名或者下级目录)
“ . ./ ”:表示上级目录 -
简单地理解Python中的
if __name__ == "__main__":
main()
https://blog.csdn.net/yjk13703623757/article/details/77918633
-
name = "konichan"
print("my id is %s",name)
print("my id is %s" % name)
结果是my id is %s konichan
以及my id is konichan
注意逗号的作用(相当于加号),name并不是参数。 -
for _ in range(n):
(注意还有个冒号哈哈哈)
就相当于从0开始循环到n -
局部变量不会被全局的影响到
-
列表
ist.append(200)
在列表最后附加
list.insert (1, 400)
在第一个数后面镶嵌
list += [1000, 2000]
在列表后面附加两个数
list.remove(3)
去3这个元素
list.title(), end=' '
所有单词都是以大写开始,直到遇到空格才结束,均为小写见istitle()
list2 = sorted(list1)
按照字母表排序
list3 = sorted(list1, reverse=True)
反过来
list4 = sorted(list1, key=len)
按照字长
列表并不是 [ ] 其中的元素也可以包含一个列表 -
元组中的元素是无法修改的
list_tuple = tuple(list)
-
集合跟数学上的集合是一致的,不允许有重复元素,而且可以进行交集、并集、差集等运算。
set1.add(4)
-
字典是另一种可变容器模型,类似于我们生活中使用的字典,它可以存储任意类型对象,与列表、集合不同的是,字典的每个元素都是由一个键和一个值组成的“键值对”,键和值通过冒号分开。
scores = {'骆昊': 95, '白元芳': 78, '狄仁杰': 82}
print(scores.popitem())
删除最后的
print(scores.pop('骆昊', 100))
-
循环相关
while True
语句中一定要有结束该循环的break语句,否则会一直循环下去的,while是逻辑判断
continue
语句跳出本次循环,而break跳出整个循环。
continue
语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环,永不歇菜。 -
中括号 python—索引与切片总结(每次看到中括号就很迷惑,其实这是多维的切片)
-
切片(Slice)—重点!!
一维切片一般的就是[开始:结束:步长]
(若是高维数组,则该切片从高维的进行)
List[0:3]
取出list中0、1、2的对象,不包括边界值这是和索引最大的不同,切勿搞混
推荐参考的博客 https://www.cnblogs.com/summer1019/p/10567831.html
二维切片的可以这么理解(加上逗号就变成二维的切片操作了):[ [ 行的 : 切片 ] , [ 列的 : 切片 ] ]
→ x轴方向(最基础的一个向量)是一维
[ : , : 1 ]
只要第一列[ : , 1 ]
把第二列搞成一行的东西
[ : , :-1]
这是切片啊,只要-1列前面的,-1所在的是不要的
假设b是三行两列的数组,b[1]表示第二行的所有元素;b[1:]表示除去第一行的元素,显示后面的所有行元素;b[:1]是除去第一列后面的所有的行;b[:,0]提取第一列的所有元素;如果是b是只有一行的话,b[1]就是第二个元素
下面是这是来自runoob的截图
扩展切片 切片的第三个参数,
当第三个参数为正的时候,是正向切片,参数为负的时候,是反向切片;前面两个不存在参数,这一个就会变成步长
拷贝忍者可以进行copy的操作,浅拷贝,会建立新的内存
甚至还可以修改单个元素,以及增加某些元素a[3:3] = ['A','B','C']
(就会在3这个位置增加) -
OS
for (root, dirs, files) in walk(roots)
历遍输入所在的所有相对路径
os.path.join( , )
粘合路径,不需要在用什么str粘合啊这么麻烦 -
多进程—进程是线程的容器,不存在没有线程的进程的
在上面的代码中,我们通过Process
类创建了进程对象,通过target
参数我们传入一个函数来表示进程启动后要执行的代码,后面的args
是一个元组,它代表了传递给函数的参数。Process
对象的start
方法用来启动进程,而join
方法表示等待进程执行结束。运行上面的代码可以明显发现两个下载任务“同时”启动了,而且程序的执行时间将大大缩短,不再是两个任务的时间总和。下面是程序的一次执行结果。
#来自runoob的例子,把目标函数/进程作为目标
from multiprocessing import Process
from os import getpid
from random import randint
from time import time, sleep
def download_task(filename):
time_to_download = randint(5, 10)
sleep(time_to_download)
print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
def main():
start = time()
p1 = Process(target=download_task, args=('Python从入门到住院.pdf', ))
p1.start()
p2 = Process(target=download_task, args=('Peking Hot.avi', ))
p2.start()
p1.join() # str.join(sequence) -->sequence -- 要连接的元素序列。
p2.join()
end = time()
print('总共耗费了%.2f秒.' % (end - start))
if __name__ == '__main__':
main()
- multiprocessing模块中的
Queue
类可以被多个进程共享的队列
乱七八糟的自带函数
-
if x is not None
和if not x is None
意思为判断变量是否为NONE,None,False,0,空列表[],空字典{},空元祖(),都相当于false -
item()
把字典中每对key和value组成一个元组,并把这些元组放在列表中返回
同时还可以将字典的 key 和 value 组成一个新的列表:for k,v in d.items():
result.append(k)
result.append(v)
-
NaN(Not a Number,非数)
-
time.sleep(t)
t是延迟的时间 -
tqdm 进度条模块
-
isinstance() 与 type() 区别:
isinstance() 会认为子类是一种父类类型,考虑继承关系。
type() 不会认为子类是一种父类类型,不考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance(),返回true or false。 -
parser.add_argument('-c', action='store_true', default=false)
action就是true default就是false -
lambda 简单理解就是自定义的函数 https://blog.csdn.net/zjuxsl/article/details/79437563
-
random.seed() 可以固定随机数,如果seed参数每次都一样,那么离它最近的random 函数(也就是接下来将)产生的随机数将是固定的
-
assert expression [, arguments]
表达式后面接,'sentence'
表示对表达式的说明,出错的话就会出现Asserterror:sentence的报错 -
strip()函数,删除字符的函数
https://www.cnblogs.com/itdyb/p/5046472.html -
read()、readline()和readlines()三者间的区别
https://blog.csdn.net/qq_30868235/article/details/80580259 -
list.sort(cmp=None, key=None, reverse=False)
按照从小到大进行排序,reverse=False就是反过来
b.sort()
这样的写法才是对的, 但是b = b.sort()
是错误的写法
控制结构
迭代语句
- sqlist=[x*x for x in range(1,11) if x%2 != 0]
- while counter <= 10 and not done:
处理异常
第一种语法错误
第二种逻辑错误
-
使用 try 语句处理所提出的异常。在 try 块中调用 print 函数来处理这个异常。相应的 except
块“捕获”异常,并在发生异常时将消息打印给用户。此处程序不会终止哦。 -
如果使用raise的话,此处程序是会终止的。
raise RuntimeError("You can't use a negative number")
面向对象的编程
什么是class?就可以理解成在一个内存的区域内,这个区域内管理着很多方法,这些方法就是不同的函数。那为什么要这样写呢,是因为当你函数多了,变量也多了,为了便于管理,就把他们放到不同的区域。(_function表示只能在class中使用的函数,不加“ _ ”表示可以在class之外可以调用的函数)
构造一个新类
class function:
def __init__(self,look,listen):
self.property_1 = look
self.property_2 = listen
-
“字面意思”:init 就是初始化形式参数,在上面包含三个项目(self,look,listen)。 self 是一个特殊参数,将始终用作返回对象本身的引用。 它必须始终是第一个形式参数;
但是,在调用时永远不会给出实际的参数值。构造函数中的符号self.property_1定义了function对象,使其具有名为property_1的内部数据对象作为其状态的一部分,说白就是他的属性。同样,self.property_2表示他还有第二个属性。两个正式参数做初始化赋值,允许新的分数对象知道它的起始值。 -
class function是个什么东西:要是
print(person = function(3,5))
打印出来的话,返回的就是他的地址,要可以打印出他真正的值,就要加个__str__, -
python是面向对象的编程,这个对象到底是什么东西,自己其实有点不求甚解,直到自己去写class的时候才恍然大悟,就用pytorch的class举例子:编写一个最简单的网络,里面的首先要对里面限定使用的变量self做初始化,设置为这个class的属性,然后在forward这里面的变量只有两种可以使用,一是带有self的初始化的属性变量,二是余下定义中类的方法,这就可以比作在一个羊圈里面只有白羊而它也只会做羊才能做的事情,你直接加一个灰羊进来或者叫它跳舞的话就不行,在这个”羊圈“——即class中只能使用属性和定义了的他的方法,这两种变量,不能直接加其他的变量进来,进来的话就要先给他打上是白羊的标签和规定好的它要做的。这样做的含义,就是为了防止变量会在全局乱串,而且便于管理。简直就是羞耻的理解哈哈哈哈,再在这个基础上看看父类子类的关系,就不难理解什么是面向对象的编程了。
继承
super().init() — 子类构造函数调用super().init() https://blog.csdn.net/paopaohll/article/details/83063349
技巧进阶
x for i,x in enumerate(lst) if filter[i] == True
学习参考:30-seconds-of-python