2019-09-10-python
python
注释: 单行#comment 多行'''comment''' """comment"""
1 2 3 4 5 6 python2 -m pip install pip install virtualenv virtualenvwrapper virtualenv testvir active.bat 或者 deactive.bat pip install flask pip freeze >requirements.txt
基础语法
1 2 from package import module import module as alias
变量和数据类型
对象(object)是内存中专门用来存储数据的一块区域,id
&& type && value
变量和对象:
(1)对象并没有直接存储到变量中,Python中变量更像是给对象起了一个别名;
(2)变量中存储的不是对象的值,而是对象的id(内存地址),使用变量时,实际上就是在通过对象id在查找对象;
(3)变量中保存的对象,只有在为变量重新赋值时才会改变;
(4)变量和变量之间是相互独立的,修改一个变量不会影响另一个变量
python中的数据类型: 不可变(Number/String/Tuple) 和
可变(list/dict/set),不可变值得是不允许变量的值发生变化,如果改变变量的值,相当于新建了一个对象,而对于相同值的对象,在内存中只有一个对象。
如果改变数字数据类型的值,意味着是一个新的对象,将会重新分配内存空间
判断是否引用的是同一个对象: x is y,类似于id(x)===id(y)
数据类型
整数、浮点数(1.23x10^9: 1.23e9)
字符串 1 2 3 4 'abc' , "xyz" >> abc xyz'I\'m\"OK\"!' >> I'm OK! r' \\\t\\' >> ' \\\t\\' # 原始字符串r r' '' hello,\nworld''' >> 'hello,\\nworld'
布尔值 1 2 3 and : ture and flase >> falseor : false or true >> truenot : not false >> true
变量
变量名必须是大小写英文、数字和_的组合,且不能用数字开头,
Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来.
1 2 3 4 5 6 7 a = 'ABC' b = a a = 'XYZ' print (b) >> ABC
字符串和编码
Python
3版本中,字符串是以Unicode编码
1 2 3 4 5 6 7 8 9 10 11 ord ('中' ) >> 20013 chr (25991 ) >> '文' '中文' .encode('utf-8' ) >> b'\xe4\xb8\xad\xe6\x96\x87' b'\xe4\xb8\xad\xff' .decode('utf-8' , errors='ignore' ) >> '中' len (b'ABC' ) >> 3 len ('中文' .encode('utf-8' )) >> 6
格式化输出(%)
%s %d %? 1 2 3 'Hello, %s' % 'world' >> 'Hello, world' print ('%2d-%02d' % (3 , 1 )) >> 补空格3 -01print ('%.2f' % 3.1415926 ) >> 3.14
format() 1 'Hello, {0}, 成绩提升了{1:.1f}%' .format ('小明' , 17.125 ) >> 'Hello, 小明, 成绩提升了17.1%'
格式化字符串
格式化字符串,可以通过在字符串前添加一个f来创建一个格式化字符串
在格式化字符串中可以直接嵌入变量 1 c = f'hello {a} {b} ' \ print (f'a = {a} ' )
list tuple dict set
list[]
Python内置的数据类型列表:list是一种有序的集合,可以随时添加和删除其中的元素
方法
说明
list.append()
追加元素到末尾
list.insert()
插入到指定位置
list.pop()方法
删除指定位置元素
list.len()
列表元素个数
1 2 3 4 5 6 7 8 9 10 11 classmates = ['Michael' , 'Bob' , 'Tracy' ] >> ['Michael' , 'Bob' , 'Tracy' ]len (classmates) >> 3 classmates[-1 ] >> 'Tracy' classmates[-2 ] >> 'Bob' classmates.append('Adam' ) >> ['Michael' , 'Bob' , 'Tracy' , 'Adam' ] classmates.insert(1 , 'Jack' ) >> ['Michael' , 'Jack' , 'Bob' , 'Tracy' , 'Adam' ] classmates.pop(3 ) >> 'Tracy' -->['Michael' , 'Jack' , 'Bob' , 'Adam' ] classmates[1 ] = 'Sarah' >> ['Michael' , 'Sarah' , 'Tracy' ] L = ['Apple' , 123 , True ] s = ['python' , 'java' , ['asp' , 'php' ], 'scheme' ]
tuple()
Python内置的数据类型有序列表叫元组:tuple,tuple和list非常类似,但是tuple一旦初始化就不能修改
1 2 3 4 classmates = ('Michael' , 'Bob' , 'Tracy' ) t = ('a' , 'b' , ['X' , 'Y' ]) >> t[2 ][0 ] = 'X' >> t[2 ][1 ] = 'Y'
dict
字典的键可以是任意的不可变对象(int, str,
bool, tuple…), 不能重复;字典的值可以是任何对象
{key1:value1,key2:value2,…}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 d = dict (name='Li' ,age='1' ,gender='boy' ) d = dict ([('name' ,'Li' ),('age' ,'1' )]) d = {'name' : 'Li' , 'age' : 1 , 'gender' : 'boy' } d['name' ] >> Li d['name' ] = "Xing" d.get('name' , default) >> Li d.pop('name' ) >> 删除name对应的值for k in d.keys(): print (k,d[k]) >> name Li age 1 gender byfor v in d.values(): print (v)for k,v in d.items(): print (k , '=' , v) >> name = Li age = 18 gender = boy
set
集合中只能存储不可变对象,不重复且无序;
将字典转为集合只包含字典中键
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的
1 2 3 4 s = {'a' , 'b' , '1,' '2' , '3' } >> {'a' , 'b' , 1 , 2 , 3 } s = set ([1 , 2 , 3 , 1 , 4 ]) >> {1 , 2 , 3 , 4 } s.add(5 ) s.remove(4 )
条件判断&&循环(注意缩进)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 i = 100 while i < 1000 : bai = i // 100 shi = i // 10 % 10 ge = i % 10 if bai**3 + shi**3 + ge**3 == i: print (i) i += 1 ----------------------------------------from time import * begin = time() num = int (input ('输入大于1的整数:' )) i = 2 while i <= num: flag = True j = 2 while j <= i ** 0.5 : if i % j == 0 : flag = False break j += 1 if flag: print (i) i += 1 end = time()print ("use time=" ,end - begin, '秒' ) ---------------------------------------------- i = 0 while i < 9 : i += 1 while j < i: j += 1 print (f"{j} *{i} ={i*j} " , end="" ) print () ---------------------------------------------- i = 0 while i < 5 : i += 1 if i == 2 : break continue print (i) i += 1 else : print ('循环结束' ) --------------------------------------------- names = ['Michael' , 'Bob' , 'Tracy' ]for name in names: print (name)
迭代器:iter和生成器:yield
迭代器是访问集合元素的一种方式,是可以记住遍历的位置的对象,从集合第一个元素开始到所有元素被访问完结束,只能往前不会后退;基本方法iter()和next(),字符串、列表和元组均可用于创建迭代器
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器,调用一个生成器函数,返回的是一个迭代器对象,在调用生成器运行的过程中,每次遇到
yield 时函数会暂停并保存当前所有的运行信息,返回 yield
的值, 并在下一次执行 next() 方法时从当前位置继续运行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import sysdef fibonaci (n,w=0 ): a, b, counter = 0 , 1 , 0 while True : if (counter >n): return yield a a, b = b, a + b print ('%d,%d' % (a,b)) counter +=1 f = fibonaci(3 ,0 ) while True : try : print (next (f), enf=" " ) except : sys.exit() ------------ Output:0 1 ,1 1 1 ,2 1 2 ,3 2 3 ,5
函数
概念
函数是一个对象,在内存中专门用来存储数据的一块区域;如果形参执行的是一个对象,当通过形参去改对象时,会影响到所有指向该对象的变量;print(fn),fn是函数对象,实际是打印函数对象;而print(fn()),则是在打印fn()函数的返回值
定义:
1 2 def functionName (argu1, argu2, ... ): code block
函数的参数:
位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n
1 2 3 4 5 6 def power (x,n ): s = 1 while n > 0 : n = n -1 s = s * x return s
默认参数,必须指向不变对象 1 2 3 4 5 def add_end (L=None ): if L is None : L = [] L.append('END' ) return L
可变参数,允许传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple
1 2 3 4 5 6 7 8 def calc (*numbers ): sum = 0 for n in numbers: sum = sum + n * n return sum >>> nums = [1 , 2 , 3 ]>>> calc(*nums) 14
关键字参数,允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
1 2 3 4 5 def person (name, age, **kw ): print ('name:' , name, 'age:' , age, 'other:' , kw)>>> person('Bob' , 35 , city='Beijing' ) name: Bob age: 35 other: {'city' : 'Beijing' }
递归:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def factorial (n ):''' 求任意数的阶乘 参数: n: 要求阶乘的数字 ''' if n == 1 : return 1 return n * factorial(n-1 ) ------------------------------def huiWen (s ):''' 判断是否为回文字符串 参数: s:要检查的字符串 ''' if len (s) == 2 : return False elif s[0 ] != s[-1 ]: return False return huiWen(s[1 :-1 ])
filter、匿名函数: lambda 与
map
filter(function,iterable):
可以从序列中过滤出符合条件的元素,保存到一个新的序列对象中,
1 2 a = filter (lambda x: x % 2 == 0 , range (10 ))>>> <filter object at 0x0000027939040390 >
lambda 参数列表 : 返回值:
map(function, iterable, ...):
可以对可迭代对象中的所有元素做指定操作,然后将其添加到一个新的对象中返回,
1 2 map (lambda x, y: x + y, [1 , 3 , 5 , 7 , 9 ], [2 , 4 , 6 , 8 , 10 ]) >>> <map object at 0x0000027939040CF8 >
闭包:函数嵌套
&& 将内部函数作为返回值返回 &&
内部函数必须使用到外部函数的变量
1 2 3 4 5 6 7 8 def makeAverager (): nums = []def averager (n ): nums.append(n) return sum (nums)/len (nums)return averager averager = makeAverager()
装饰器:
在不改变函数代码的情况下,扩展函数功能
1 2 3 4 5 6 7 8 9 10 11 12 13 def log (old ): def wrapper (*args, **kw ): print ('call %s():' % func.__name__) return func(*args, **kw)return wrapper@log def now (): print ('2015-3-25' )>>> now() call now(): 2015 -3 -25
面向对象编程
基础
特征:
封装:隐藏对象中一些不希望被外部所访问到的属性或方法,确保对象中的数据安全
getter 获取对象中的指定属性(get_属性名)
setter 用来设置对象的指定属性(set_属性名) 1 2 3 4 5 6 7 8 9 10 11 class Person : def __init__ (self,name ): self ._name = name def get_name (self ): return self ._name def set_name (self , name ): self ._name = name p = Person('孙悟空' ) print (p._name)
继承:实现子类的属性和方法的功能扩展,保证了对象的可扩展性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 class Animal : def run (self ): print ('动物会跑~~~' ) def sleep (self ): print ('动物睡觉~~~' ) @property def name (self ): return self ._name @name.setter def name (self,name ): self ._name = name class Dog (Animal ): def __init__ (self,name,age ): super ().__init__(name) self ._age = age def bark (self ): print ('汪汪汪~~~' ) def run (self ): print ('狗跑~~~~' ) @property def age (self ): return self ._age@age.setter def age (self,age ): self ._age = name d = Dog('旺财' ,18 ) print (d.name) print (d.age)
多态:一个对象可以以不同的形态去呈现,保证了程序的灵活性
模块(python文件) 包(文件)
导入模块: 1 2 import 模块名 import 模块名 as 模块别名
访问模块变量:模块名.变量名
导入模块部分内容: 1 from 模块名 import 变量 as 别名
异常
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 print ('异常出现前' ) l = []try : print (10 /0 )except NameError: print ('出现 NameError 异常' )except ZeroDivisionError: print ('出现 ZeroDivisionError 异常' )except IndexError: print ('出现 IndexError 异常' )except Exception as e : print ('未知异常' ,e,type (e))finally : print ('无论是否出现异常,该子句都会执行' )print ('异常出现后' ) ----------------------------------------------------------------------------------class MyError (Exception ): pass def add (a,b ): if a < 0 or b < 0 : raise MyError('自定义的异常' ) r = a + b return rprint (add(-123 ,456 ))
文件
文件打开 –>操作文件(读/写) –>关闭文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 file_name = 'demo.txt' file_obj = open (file_name) content = file_obj.read() file_obj.close() file_name = 'demo.txt' try : with open (file_name,encoding='utf-8' ) as file_obj: file_content = '' chunk = 100 while True : content = file_obj.read(chunk) if not content: break file_content += contentexcept FileNotFoundError : print (f'{file_name} 这个文件不存在!' )print (file_content)
Py速成教程
目标:从”能看懂”到”能写出来”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 """ 1. nums = list(map(int, input().split())) 2. from collections import Counter, deque, defaultdict 3. freq = Counter(s) 4. sorted(items, key=lambda x: (-x[1], x[0])) 5. ' '.join(map(str, result)) 6. dq = deque(); dq.append(x); dq.popleft() 7. visited = set(); visited.add((r,c)) 8. directions = [(-1,0),(1,0),(0,-1),(0,1)] 9. dp = [0] * (n+1) 10. float('inf') # 无穷大初始值 """
第一章:输入输出(必须熟练,格式错误=0分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 n = int (input ()) nums = list (map (int , input ().split())) a, b = map (int , input ().split()) s = input ().strip() n = int (input ()) lines = []for _ in range (n): lines.append(input ().strip()) import sys data = sys.stdin.read().splitlines() print (42 ) print ("hello" ) print (1 , 2 , 3 ) print (1 , 2 , 3 , sep=',' ) result = [1 , 2 , 3 ]print (' ' .join(map (str , result))) for x in result: print (x)
第二章:字符串操作(必考)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 s = "Hello World" s.lower() s.upper() s.strip() s.split() s.split(',' ) s.replace('l' , 'L' ) len (s) s[::-1 ] s.isalpha() s.isdigit() s.isalnum() 'Hello' in s for c in s: print (c) ord ('A' ) chr (65 ) ord ('a' ) - ord ('A' ) from collections import Counter freq = Counter(s.lower()) freq['l' ] freq.most_common(3 ) words = ['hello' , 'world' ]' ' .join(words) '' .join(words) s = "abcdef" s[0 ] s[-1 ] s[1 :4 ] s[:3 ] s[3 :] s[::2 ] s[::-1 ]
第三章:列表操作(最常用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 nums = [3 , 1 , 4 , 1 , 5 , 9 , 2 , 6 ] nums.append(7 ) nums.insert(0 , 0 ) nums.pop() nums.pop(0 ) nums.remove(1 ) len (nums) nums.count(1 ) nums.index(5 ) nums.sort() nums.sort(reverse=True ) sorted (nums) nums.sort(key=lambda x: abs (x)) pairs = [(1 , 3 ), (2 , 1 ), (1 , 2 )] pairs.sort(key=lambda x: (x[0 ], -x[1 ])) squares = [x**2 for x in range (10 )] evens = [x for x in nums if x % 2 == 0 ] matrix = [[0 ]*3 for _ in range (3 )] nums[1 :4 ] nums[::-1 ] nums[:3 ] sum (nums) max (nums) min (nums) sum (nums)/len (nums)
第四章:字典和集合(高频)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 d = {'a' : 1 , 'b' : 2 , 'c' : 3 } d['a' ] d['d' ] = 4 d.get('e' , 0 ) d.keys() d.values() d.items() 'a' in d del d['a' ] for key, val in d.items(): print (key, val) from collections import defaultdict count = defaultdict(int ) count['a' ] += 1 groups = defaultdict(list ) groups['odd' ].append(1 ) s = {1 , 2 , 3 , 4 } s.add(5 ) s.remove(1 ) s.discard(10 ) 3 in s a = {1 , 2 , 3 } b = {2 , 3 , 4 } a & b a | b a - b nums = [1 , 2 , 2 , 3 , 3 , 3 ] unique = list (set (nums))
第五章:双端队列(BFS必用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 from collections import deque dq = deque() dq.append(1 ) dq.appendleft(0 ) dq.pop() dq.popleft() len (dq) dq[0 ] dq[-1 ] def bfs (grid, start, end ): rows, cols = len (grid), len (grid[0 ]) queue = deque([(start[0 ], start[1 ], 0 )]) visited = set () visited.add(start) directions = [(-1 ,0 ),(1 ,0 ),(0 ,-1 ),(0 ,1 )] while queue: r, c, steps = queue.popleft() if (r, c) == end: return steps for dr, dc in directions: nr, nc = r+dr, c+dc if (0 <= nr < rows and 0 <= nc < cols and (nr, nc) not in visited and grid[nr][nc] != '#' ): visited.add((nr, nc)) queue.append((nr, nc, steps+1 )) return -1
第六章:排序技巧(面试高频)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 nums = [3 , 1 , 4 , 1 , 5 ]sorted (nums) sorted (nums, reverse=True ) words = ['banana' , 'apple' , 'cherry' , 'date' ]sorted (words, key=len ) sorted (words, key=lambda x: x[-1 ]) students = [('Alice' , 85 ), ('Bob' , 92 ), ('Charlie' , 85 )] students.sort(key=lambda x: (-x[1 ], x[0 ])) d = {'a' : 3 , 'b' : 1 , 'c' : 2 }sorted (d.items(), key=lambda x: x[1 ]) sorted (d.items(), key=lambda x: -x[1 ]) sorted (d.items(), key=lambda x: (-x[1 ], x[0 ]))
七章:递归和DFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 def recursion (参数 ): if 终止条件: return 结果 return recursion(更小的参数) def dfs (grid, r, c, visited ): rows, cols = len (grid), len (grid[0 ]) if (r < 0 or r >= rows or c < 0 or c >= cols or visited[r][c] or grid[r][c] == '0' ): return visited[r][c] = True dfs(grid, r+1 , c, visited) dfs(grid, r-1 , c, visited) dfs(grid, r, c+1 , visited) dfs(grid, r, c-1 , visited)
第八章:动态规划(200分大题)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 def max_subarray (nums ): max_sum = nums[0 ] curr = nums[0 ] for n in nums[1 :]: curr = max (n, curr + n) max_sum = max (max_sum, curr) return max_sum def knapsack (W, weights, values ): dp = [0 ] * (W + 1 ) for i in range (len (weights)): for w in range (W, weights[i]-1 , -1 ): dp[w] = max (dp[w], dp[w-weights[i]] + values[i]) return dp[W] def lcs (s1, s2 ): m, n = len (s1), len (s2) dp = [[0 ]*(n+1 ) for _ in range (m+1 )] for i in range (1 , m+1 ): for j in range (1 , n+1 ): if s1[i-1 ] == s2[j-1 ]: dp[i][j] = dp[i-1 ][j-1 ] + 1 else : dp[i][j] = max (dp[i-1 ][j], dp[i][j-1 ]) return dp[m][n]
第九章:常用技巧速查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 bin (10 ) oct (10 ) hex (10 ) int ('1010' , 2 ) int ('ff' , 16 ) import math math.gcd(12 , 8 ) 12 * 8 // math.gcd(12 , 8 ) float ('inf' ) float ('-inf' ) min_val = float ('inf' ) max_val = float ('-inf' ) for i, val in enumerate (['a' , 'b' , 'c' ]): print (i, val) keys = ['a' , 'b' , 'c' ] values = [1 , 2 , 3 ]for k, v in zip (keys, values): print (k, v) any ([False , True , False ]) all ([True , True , True ]) import heapq heap = [] heapq.heappush(heap, 3 ) heapq.heappush(heap, 1 ) heapq.heappush(heap, 2 ) heapq.heappop(heap) heapq.heappush(heap, -3 ) -heapq.heappop(heap) import bisect nums = [1 , 3 , 5 , 7 , 9 ] bisect.bisect_left(nums, 5 ) bisect.bisect_right(nums, 5 )
第十章:完整例题(综合运用)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def solve (): n = int (input ()) words = [] for _ in range (n): words.append(input ().strip()) words.sort(key=lambda x: (len (x), x)) for w in words: print (w)