1 #2017-7-17 2 1、用len()函数可以获得list元素的个数; 3 len()可以获取字符串长度 4 5 2、 list正向0开始索引,,逆向-1开始索引; 6 也可以把元素插入到指定的位置,比如索引号为1的位置: 7 list.insert(索引,元素) 8 要删除list末尾的元素,用pop()方法: 9 list.pop() 10 要删除指定位置的元素,用pop(i)方法,其中i是索引位置 11 要把某个元素替换成别的元素,可以直接赋值给对应的索引位置: 12 list[i] = *** 13 14 3、 只有1个元素的tuple定义时必须加一个逗号(1,)来消除歧义 15 16 4、if 判别式 :(注意别少了“:”) 17 else/elif 18 19 5、name = input()返回的数据类型是str! 20 6、for x in ...循环就是把 序列中 每个元素代入变量x,然后执行缩进块的语句;Python提供一个range()函数,可以生成一个整数序列; 21 22 7、dict在内部就可以直接计算出Michael对应的存放成绩的“页码”,也就是95这个数字存放的内存地址,直接取出来,所以速度非常快;避免key不存在的错误,有两种办法,一是通过in判断key是否存在;dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value;删除一个key,用dict.pop(key)方法,对应的value也会从dict中删除 23 24 8、创建一个set,需要提供一个list不可以放入可变对象,因为无法判断两个可变对象是否相等 25 s = set([1, 1, 2, 2, 3, 3]) 26 s = {1, 2, 3} 27 add(key)方法可以添加元素到set中,可以重复添加,但不会有效果 28 s.add(4) 29 s.remove(4) 30 set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作,返回交,并集(合)set()表示空集,只能用len()去判断。 31 32 9、None是一个特殊的常量;None和任何其他的数据类型比较永远返回False;你可以将None复制给任何变量 33 34 10、定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号; 35 没有return语句,函数执行完毕后也会返回结果,只是结果为None 36 调用的时候,既可以按顺序提供默认参数,比如调用enroll('Bob', 'M', 7),意思是,除了name,gender这两个参数外,最后1个参数应用在参数age上,city参数由于没有提供,仍然使用默认值。 37 38 也可以不按顺序提供部分默认参数。当不按顺序提供部分默认参数时,需要把参数名写上(非默认参数也可以)。 39 40 定义默认参数要牢记一点:默认参数必须指向不变对象或只有变量名! 41 42 定义参数 数目可变的函数:function(*number)参数前面加了一个*号。在函数内部,参数numbers接收到的是一个tuple;Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去; 43 44 11、递归: 45 ===> fact(5) 46 ===> 5 * fact(4) 47 ===> 5 * (4 * fact(3)) 48 ===> 5 * (4 * (3 * fact(2))) 49 ===> 5 * (4 * (3 * (2 * fact(1)))) 50 ===> 5 * (4 * (3 * (2 * 1))) 51 ===> 5 * (4 * (3 * 2)) 52 ===> 5 * (4 * 6) 53 ===> 5 * 24 54 ===> 120 55 56 在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。 57 58 12、递归(Iteration) 59 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration) 60 很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代 61 因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样; 62 默认情况下,for key in d,dict迭代的是key。 63 如果要迭代value,可以用for value in d.values()(应该是字典的一种函数), 64 如果要同时迭代key和value,可以用for k, v in d.items()。 65 66 Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身: 67 for i, value in enumerate(['A', 'B', 'C']): 68 ... print(i, value) 69 70 for循环里,同时引用了两个变量: 71 for x, y in [(1, 1), (2, 4), (3, 9)]: 72 ... print(x, y) 73 74 13、方法与函数 75 方法和对象相关; 76 函数和对象无关。 77 Java中只有方法,C中只有函数,而C++里取决于是否在类中。 78 79 14、循环列表生成:[元素形式,内部“简单 单支 判断语句”] 80 L1 = ['Hello', 'World', 18, 'Apple', None] 81 l2 = [s.lower() for s in L1 if isinstance(s,str)] 82 print(l2) 83 84 15、生成器:generator 85 在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。 86 把一个列表生成式的[]改成(), g = (x * x for x in range(10)) 87 就创建了一个generator 88 通过next(g)函数获得generator的下一个返回值 89 next(g) 90 0 91 ...也可通过for循环输出(则不需要nex语句) 92 93 16、可迭代的“函数” yield 94 函数定义中包含yield语句,那么这个函数就不再是一个普通函数,而是一个generator函数 95 generator和函数的执行流程不一样。 96 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。 97 generator的函数,在每次调用next()的时候执行,遇到yield语句返回(返回yield后的值),再next()时,继续从上次返回的yield语句处继续执行(也就是函数执行只是中断了一下,可以返回继续执行) 98 99 ###*********************************我是分割线************************************************************** 100 #2017-07-18 15:15:42 101 102 1、 一类是集合数据类型,如list、tuple、dict、set、str等, 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable 103 一类是generator,生成的迭代对象:可以被next()函数调用,并不断返回下一个值的对象称为迭代器:Iterator 104 Iter()可以将list ,tuple,dict..转换成可迭代对象 105 106 2、函数式编程就是,将函数作为参数传参! 107 108 3、map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的 109 Iterator返回。 r = map(f函数, [1, 2, 3, 4, 5, 6, 7, 8, 9]),结果r是一个Iterator 110 Iterator是一种惰性序列:仅在需要的时候才会去调用它的body 111 通过list()函数让它把整个序列都计算出来并返回一个list。list(r) 112 113 4、reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是: 114 reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) 115 116 5、 def char2num(s): 117 return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] 118 {}是一个字典L,L[key]取字典中的value 119 120 6、s=''.join(s);s=['s','b','c']zifu列表连接成字符串 121 函数中还可以定义函数 122 123 7、filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。 124 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) 125 filter()这个高阶函数,注意到filter()函数返回的是一个Iterator,也就是一个惰性序列 126 127 8、常数并不能直接转乘Iterable,可以先转str, 128 129 9、key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序(也就是按照key转换后的值与默认“从小到大”的顺序,对list排序,这里好像没有True or Flase的问题,函数完成的只是转换,有默认的顺序) 130 131 10、sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序(key估计是其默认参数,所以更改是要写出变量名。)sorted([36, 5, -12, 9, -21], key=abs) 132 133 11、 134 135 10、正则表达式, 136 (1)、[]匹配字符集,使用其中一个字符 137 (2)、s=r"^**",匹配行首;(其在[]中,'除了') 138 s=r"**$",匹配行尾;(其在[]中,'无意') 139 140 (3)>>> s(当使用''''''输入字符串时,实际存储是下面) 141 ' hello slie seif ejf aef ef e f ge ge g ' 142 这种情况下,行首匹配只能管第一行,可用多行匹配参数fimtall(*,*,re.M) 143 (4) 144 d 匹配任意十进制数,相当于 [0-9] 145 D 匹配任意非数字字符,相当于 [^0-9] 146 s 匹配任意空白字符,相当于 [ fv] 147 S 匹配任意非空白字符,相当于 [^ fv] 148 w 匹配任意数字和字母,相当于 [a-zA-Z0-9_] 149 W 匹配任意非数字和字母的字符,相当于 [^a-zA-Z0-9_] 150 + 匹配前一个字符或子表达式一次或多次 151 * 匹配前面的字符或者子表达式0次或多次 152 {n} 匹配前一个字符或子表达式n次 153 {m,n} 匹配前一个字符或子表达式至少m次至多n次 154 ? 匹配前一个字符或子表达式0次或1次重复 155 156 (5)编译后还是要使用re调用方法,re. 157 pattern1 = re.compile(p1)#同样是编译 158 matcher1 = re.search(pattern1,key)#同样是查询 159 160 (6)方法: 161 findall()找到 RE匹配的所有子串,并把它们作为一个列表返回 162 import re; 163 s=r""; 164 re.findall(s,"") 165 (7)分组: 166 用 () 表示的就是要提取的分组(Group), 167 如果正则表达式中定义了组,就可以在Match对象上用group()方法提取出子串来 168 group(0)永远是原始字符串,group(1)、group(2)……表示第1、2、……个子串 169 >>> m = re.match(r'^(d{3})-(d{3,8})$', '010-12345') 170 >>> m.group(0) 171 '010-12345' 172 >>> m.group(1) 173 '010' 174 >>> m.group(2) 175 '12345' 176 177 178 11、返回函数,感觉挺难,应该是没有接触过的原因 179 180 12、关键字lambda表示匿名函数,因为函数没有名字,不必担心函数名冲突, 181 map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])冒号前面的x表示函数参数。 182 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。 183 184 13、函数对象有一个__name__属性,可以拿到函数的名字: 185 def now(): 186 print('2015-3-25') 187 188 now.__name__ 189 190 14、装饰器,也是一个没有接触过的东西 191 192 #2017-07-19 13:31:48 193 1、 模块就是一个.py文件,引入文件,就要具体到.py文件,包名指向__init__.py文件,只引入包名,mean引入包中的__init__.py 194 使用模块还可以避免函数名和变量名冲突,尽量不要与内置函数名字冲突. 195 为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。 196 每一个包目录下面都会有一个__init__.py的文件,否则,Python就把这个目录当成普通目录,而不是一个包 197 __init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany。 198 自己创建模块时要注意命名,不能和Python自带的模块名称冲突。 199 200 2、Python模块的标准文件模板(编写一个hello的模块:): 201 202 任何模块代码的第一个字符串都被视为模块的文档注释 203 使用__author__变量把作者写进去 204 导入sys模块后,就有了变量sys指向该模块,利用sys,就可以访问sys模块的所有功能 205 sys模块argv变量,用list存储了命令行的所有参数,第一个参数是该.py文件的名称 206 运行python3 hello.py获得的sys.argv就是['hello.py'] 207 这种__name__,只有运行主文件是本文件时才执行,最常见的就是运行测试 208 209 210 #!/usr/bin/env python3 211 # -*- coding: utf-8 -*- 212 213 ' a test module ' 214 215 __author__ = 'Michael Liao' 216 217 import sys 218 219 def test(): 220 221 args = sys.argv 222 if len(args)==1: 223 print('Hello, world!') 224 elif len(args)==2: 225 print('Hello, %s!' % args[1]) 226 else: 227 print('Too many arguments!') 228 229 230 if __name__=='__main__': 231 test() 232 233 3、 正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等 234 __xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途 235 _xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等 236 237 4、当我们试图加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错: 238 默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中 239 sys.path 240 ['', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python34.zip', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages'] 241 242 5、面向对象思想: 243 244 5.1假设我们要处理学生的成绩表,为了表示一个学生的成绩,面向过程的程序可以用一个dict表示: 245 246 std1 = { 'name': 'Michael', 'score': 98 } 247 std2 = { 'name': 'Bob', 'score': 81 } 248 而处理学生成绩可以通过函数实现,比如打印学生的成绩: 249 250 def print_score(std): 251 print('%s: %s' % (std['name'], std['score'])) 252 253 254 5.2如果采用面向对象的程序设计思想,我们首选思考的不是程序的执行流程,而是Student这种数据类型应该被视为一个对象,这个对象拥有name和score这两个属性(Property)。如果要打印一个学生的成绩,首先必须创建出这个学生对应的对象,然后,给对象发一个print_score消息,让对象自己把自己的数据打印出来。 255 256 class Student(object): 257 258 def __init__(self, name, score): 259 self.name = name 260 self.score = score 261 262 def print_score(self): 263 print('%s: %s' % (self.name, self.score)) 264 265 266 6、目前不准备设计python类思想的编程!c++还没搞熟,,,,,, 267 and、or、not是python提供的逻辑操作符 268 只要不为0的值都会转化为bool类型,所以abc直接与bool比较,没法比较,但是if 'abc' ==> if bool('abc') 269 if(条件) 270 print('abc == True','abc' == True) 271 if 'abc': 272 print('abc == True') 273 274 7、即使文件已经关闭,但f还是拥有这个文件的句柄,所以转换为bool类型为 True 275 f=open("Iter.py") 276 277 f.close() 278 if f: 279 print(True) 280 else: 281 print(False) 282 283 8、默认都是读取文本文件,并且是UTF-8编码的文本文件(应该是按照UTF-8读取,但是内部按照UNICODEING存储) 284 要读取二进制文件,用'rb'模式打开文件 285 写文件和读文件是一样的,传入标识符'w'或者'wb'表示写文本文件或写二进制文件: 286 当我们写文件时,是放到内存缓存起来,只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘 287 288 289 9、操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中 290 # 查看当前目录的绝对路径: 291 os.path.abspath('.') 292 293 创建,不要直接拼字符串,而要通过os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符: 294 os.path.join('/Users/michael', 'testdir') 295 '/Users/michael/testdir' 296 297 拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名: 298 >>> os.path.split('/Users/michael/testdir/file.txt') 299 ('/Users/michael/testdir', 'file.txt') 300 301 可以直接让你得到文件扩展名,很多时候非常方便: 302 >>> os.path.splitext('/path/to/file.txt') 303 ('/path/to/file', '.txt') 304 305 这些合并、拆分路径的函数并不要求目录和文件要真实存在,它们只对字符串进行操作 306 307 10、把'变量'变成可存储或传输的过程称之为序列化(不只是保存数据,还有结构,,,,) 308 变量内容从序列化的对象重新读到内存里称之为反序列化 309 310 pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件。或者用另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object. 311 当我们要把对象从磁盘读到内存时,可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象,也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象。 312 313 11、有关操作系统多线程,多进程编程也是没有接触过的东西 314 315 ************************************************************************************************** 316 #2017-07-22 14:57:26 317 1、class Student(object): 318 pass 319 class后面紧接着是类名,即Student, 320 类名通常是大写开头的单词, 321 紧接着是(object),表示该类是从哪个类继承下来的 322 323 2、 自由地给一个实例变量绑定属性,类中并没有定义,但是实例化后却能添加属性!!! 324 类数据属性:定义在类里面但在函数外面的变量,它们都是静态的。 325 实例属性:__init__()方法里的变量就是实例属性,这些属性只有被创建时才会被创建 326 可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去 327 初始化__init__方法的第一个参数永远是self,表示创建的实例本身,就可以把各种属性绑定到self 328 329 class Student(object): 330 331 def __init__(self, name, score): 332 self.name = name 333 self.score = score 334 def print_score(self): 335 print('%s: %s' % (self.name, self.score)) 336 337 3、 有了__init__方法,在创建实例就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传 338 Python解释器自己会传进去 339 类中方定义方法,除了第一个参数是self外,其他和普通函数一样。 340 要调用一个方法,实例变量上直接调用,除了self不用传递,其他参数正常传入bart.print_score() 341 342 4、属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private) 343 def __init__(self, name, score): 344 self.__name = name 345 self.__score = score 346 347 5、Python “没有变量”,有“名字绑定”,一个名字为一个实例(instance)的引用,变量只是大家沿用了更熟悉的概念而已。 348 `a = 20` 这句代码里,`a` 只是一个名字(引用), 349 真正存在的是:各种类型‘值’,其内存不以变量名而转移,没有引用会消失! 350 351 ********************************************************************************************************* 352 #2017-07-23 16:07:30 353 354 1、鉴于python 中没有指针引用这类具体类型,想要使用这类功能的时候,对于当个变量来说似乎没有这种功能,因为没有像c、c++ 中直接代表变量内存的东西,python有的全部是‘引用’,故对于列表,之类的数据,直接赋值列表名,相当于引用赋值 355 356 2、除非对饮引用直接操作,才会更改引用指向的值,否则,通过引用获取地址之类的赋值操作不会更改引用的值 357 a=1 nums=[1,2,3] 358 b=a a=nums 359 b=4(直接修改引用) a[0]=4(通过引用取地址,修改,对于变量a,nums这层的引用没变) 360 a=1 nums=[4,2,3] 361 362 *********************************************************************************************************** 363 #2017-07-24 15:24:58 364 1、str()函数直接对数字列表转换,会将[] ,也当成字符串元素转换 365 366 ********************************************************************************************************** 367 #2017-07-25 15:15:45 368 1、python 全局变量,使用:global声明变量,在声明的区域内可以使用外部的全局变量 369 name='lhf' 370 def change_name(): 371 #global name 372 name='帅了一比' 373 print('change_name',name) 374 change_name() 375 print(name) 376 377 378 2、递归中的“类似静态变量”2 379 class Solution(object): 380 def __init__(self, ways=0): 381 self.ways = ways 382 def climbStairs(self, n): 383 if n-1==0: 384 self.ways=self.ways+1 385 if n-2==0: 386 self.ways=self.ways+1 387 if n-1 > 0: 388 self.climbStairs(n-1) 389 if n-2 > 0: 390 self.climbStairs(n-2) 391 return self.ways 392 ********************************************************************************************************** 393 #2017-07-28 15:49:31 394 1、递归函数的编写:要搞清楚返回值的类型,以及怎么样使用返回值 395 2、递归真正有价值的是从返回处开始的,(从最后一层返回) 396 3、子叶节点不是数,是其子叶为None的二叉树 397 4、满足条件可终止的递归: 398 def layerroots(self): 399 for i in self.roots: 400 401 if self.last == None: 402 self.layerroots() 403 404 405 406 *********************************************************************************************************** 407 #2017-08-25 21:10:29 408 动态地改变Python搜索路径:(只能先设置路径,再导入包这一种操作吗),也许因为路径只能使用字符串处理的原因,import 不能含有字符串 409 模块必须处于Python搜索路径中才能被导入,但你不想设置个永久性的大路径,因为那样可能会影响性能,所以,你希望能够动态地改变这个路径。 410 sys.path是个列表,所以在末尾添加目录是很容易的,用sys.path.append就行了。当这个append执行完之后,新目录即时起效,以后的每次import操作都可能会检查这个目录。 411 如同解决方案所示,可以选择用sys.path.insert(0,…,这样新添加的目录会优先于其他目录被import检查。 412 413 ********************************************************************************************************** 414 在python 中对图像的通道操作 415 http://www.voidcn.com/article/p-otstjfet-z.html 416 417 ***************************************************************************************************** 418 #2017-10-24 22:49:22 419 python cv2显示保存热点图 420 cv2.applyColorMap(data,cv2.COLORMAP_HOT) 421 422 **************************************************************************************************** 423 利用增加纬度的方式单通道边三通道,每个元素扩展至三个数 424 data4=np.dstack((data1,data2,data3)) 425 426 **************************************************************************************************** 427 numpy中的数据类型转换,不能直接改原数据的dtype! 只能用函数astype() 428 429 ************************************************************************************************* 430 #np多维矩阵存储方式 431 #当其仅作为数据存储时,可继续按照数组形式理解,分页存储[页索引][行索引][行中,具体一个] 432 #当其使用轴向函数时,立体理解好点,越往后的轴,所包含的“元素”越具体:0轴一个元素,一个面;1轴,一个元素,一行。。。 433 #这都是最值的索引函数,取0轴索引最值,取1轴索引最值,取2轴索引最值,输出与其垂直的平面形状, 434 print(np.argmax(a, axis=2)) 435 print(a.shape) 436 437 438 439 **************************************************************************************************** 440 #np.pad补边(输入矩阵,范围,方式,值): 441 #范围每个() 442 #描述一个维度有几个()意味着填补几个维度,此维度整体扩充,(前补几个,后补几个) 443 #填补这么多(1275,1110,3) 444 padded_I = np.pad(I, offset_3d, 'constant', constant_values=(0)) 445 446 447 ***************************************************************************************************** 448 np.transpose((2,0,1)) 449 #(2,0,1)是shape列表的索引, 450 #例shape(10,10,3)>shape(3,10,10) 451 #按照上面转换,整体形状转变 452 #元素也照此变化到新的位置,此时将索引视为一个列表,(2,0,1)就是其索引, a[0][1][2]->a[2][0][1] 453 #最后的效果就是图片数据重构的感觉, 454 #不会造成通道交换,因为整体变换,通道那一维的索引整体变化,相对不变 455 456 #还有一个只交换行内元素的位置,a[...,[2,1,0]],用于图片通道交换,[2,1,0]同上 457 458 459 ****************************************************************************************************** 460 #前者返回垂直轴面的最大值,后者返回最大值的索引 461 ens_segscore = np.amax(ens_score, axis=2) 462 ens_segmask = np.argmax(ens_score, axis=2)