安装
课程1:Hello Python
在VSC编辑器中新建Hello.py文件;
windows中的命令提示符(cmd)中执行.py文件:注意路径。转换盘符,直接输入D: E:等,之后利用cd进入存储.py文件的文件夹路径。最后运行python Hello.py文件;
cmd是直接运行.py文件 给出最后的结果。而python的交互模式(可通过‘开始’找到)更适用于每行代码运行编译。
注意把存有.py文件的文件夹路径添加到VSC工作空间(workspace)
print('1','2','3')可以同时输出多个字符串,遇到‘,’输出一个空格
输入:name = input() 之后可以键盘输入 Jie 给name变量
#class 1
print('Hello, Python')
name = input()
print(name)
课程2:Python语法
Python代码是缩进式的,因此复制粘贴可能容易出问题
数据类型:整数,
10_000=10000`;**浮点数**用科学计数法,`1.2e3=1200,1.2e-3=0.0012`;**字符串**,`'I am OK', "I'm OK", 'I\'m \"OK\"'
转义字符'':'\n'换行,'\'续写(三引号可以续写字符串),'\t'制表符,r' '表示字符串' '内不转义
布尔值'True''False':注意大小写;可以用'and' 'or' 'not'进行与或非运算
变量:静态语言(赋予变量类型)与动态语言(可以多次赋予不同类型值)
-
加减乘除:
- '//'地板除法,
10//3=3;1//3=0;
- 取余,``10%3=1`;
- 幂函数,
**pow**(3,2) =3\**2=9
; - 除法曲余,
**divmod**(15,6) = (2,3);
- 字符串相加,
'Jie'+'Xu' = 'JieXu'
- '//'地板除法,
Python3是用Unicode编码的因此其支持多语言字符串'讲真的a!';ord()把字符转变为编码,chr()把编码识别成对应字符
-
字符串内格式化:'%s'字符串替换,'%d'整数替换,
a = 'Hi, %s' %'world' print(a) #Hi,world a = '%d %%' % 7 print(a) #7%
-
f-string:
r=2.5 s=3.15*r**2 print(f'The area of a circle with radius {r} is {s:.2f}') #The area of a circle with radius 2.5 is 19.69
-
数据类型:List、Tuple、Dict、Set
-
List:有序表'[...]'
classmates = ['01','02','03',12,'ola',1.1,None]
;元素类型可以多样**len**(classmates)=7
索引是从0开始:
classmates[0]='01';classmates[-1]='03'
—倒数第一个添加元素:
classmates.**append**('04')
,添加到list的末尾插入元素到指定位置:
classmates.**insert**(1,'002')-->['01','002','02' ....]
删除特定位置元素:
classmates.**pop**(1)
替换list中特定位置元素可以直接赋值:
classmates[1]='02'
-
list中可以内嵌另一个list:
a = ['01','02','03'];b = ['05',a]
;则'01' = a[0]
同样'01' = b[1][0]
#list classmates = ['01','02','03']; classmates.pop(1) classmates.insert(1,'002') classmates.append('04') classmates[1]='02' print(classmates) print(len(classmates)) print(classmates[0]) classmate = ['05',classmates] print(classmates[0] == classmate[1][0])
-
Tuple:元组'(...)'
classmates = ('01','02',['03','04'])
tuple中元素的指向不变,元组中的数据指向的序号不变,因此不可更改(结构不可更改),但是list可以是tuple的一个元素,而list内的数据是可以赋值的
tuple没有.append();.insert();.pop()方法
tuple更为安全,尽量使用tuple代替list
-
Dict:字典'{...}'(键值对key-value存储)
- 特点:查找速度快!以空间换时间!
-
score = {'a':60,'b':90}
-->a的成绩=score['a'] - 添加键值对:``score['c']=85`-->c的成绩=score['c']=85
- 多次添加value给同一个key只能保留最后一次赋值的值:score['c']=85;score['c']=83;score['c']=80;-->c的成绩=score['c']=80
- 判断key是否存在于dict中:可以用in判断 'd' in score;也可以用get()方法,print(score.get('d'))-->None表示不存在对应的键对;print(score.get('c'))-->80;get()方法也可以score.get('d',70)-->70但无法对已存在于dict中的键值对作用,score.get('c',70)-->80
- dict中key通常为整数或者字符串,因为要求不可变所以list不行
-
Set:无序不重复的集合'([...])' 需提供一个list作为输入 是一组key的集合但是不存储value
-
number = set([1,2,3])
-->{1,2,3};number = set([1,2,2,4,3,3])
-->{1,2,3,4}; - 添加key:number.add(5)
- 删除key:number.remove(5)
- 两个set之间可以进行交集并集处理:交集,number & numbers;并集,number | numbers
- set中的key也是不可变的,因此同样不能是List。
- set与dict中可以用不包含list的tuple(如(1,2,3))作为key,但是成分中包含list的(如(1,[2,3]))不可
-
-
-
判断语句:if ;elif ;else
age = input() A = int(age) if A < 20: print('小年轻!') elif A < 30: print('不小了!') else: print('0.0!')
-
循环
-
for-in循环
#for in ages = [1,2,3,4,5] for age in ages: print(age) sum = 0 for age in ages: sum = sum+age print(sum)
-
* `range(101)`:生成0-100的序列,`list(range(101))`:变成有序表
* **while循环**
```python
ages = list(range(11))
a=0
while ages[a]<=10:
print(ages[a])
a+=1
```
* **break:结束循环**
```python
ages = [1,2,5,4,6,15,26,14]
a = 0
while ages[a]<=100:
print(ages[a])
if a >= 5:
print('END')
break
a = a+1
```
* **continue:跳过当前循环进入下一次循环**
```python
num = range(11)
a = 0
while num[a]<10:
a = a+1
if num[a]%2 == 0:
continue
print(num[a])
```
死循环可用Ctrl+c退出;注释代码块可用三个单引号或者三个双引号,即'''代码块'''或者"""代码块""";单行代码块注释用'#'
课程3:函数
函数是一种代码抽象的方式,可以让程序员更加关注结果而不是底层计算过程
Python内置函数:具体函数参考Built-in Functions
运算函数:abs();max();min()
数据类型转换函数:str();int();float();bool(x)(只有当x为false或者忽略/空时返回false)
可以把函数名赋予一个变量,之后直接调用这个别名即可。
p = print
;p('Hello')-->Hello-
定义新函数
def function_1(parameter1,2,3...): 以return结束函数的运行
没想好具体怎么写函数 可以用pass代替return 防止程序运行不出错
定义的函数可以同时返回多个值,因为Python函数返回值类型是一个tuple,只是代码中省略了'()'
-
导入包,后续可以使用包里的函数:如import math
def my_func1(a): pass def my_func2(b): if b >= 0: return b, 0 else: return 0 p = print p(my_func2(2)) p(my_func2(-2))
-
函数的参数
定义函数时参数可以定义明确的数量,通常是按照顺序取入参数值(即取入位置参数),也可以定义一些默认参数
设置默认参数后,调用函数时,参数输入如果是乱序的需要注意添加参数名赋值my_func3(n=3,a=2)
-
可变参数:参数可变的函数可以将输入的参数需要封装在一个list或者tuple中实现,同样也可以在参数前加入*实现。如果想将一个list或者tuple作为参数传入这个可变参数的函数,只需在调用时在list和tuple前加上*即可。可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
def my_func4(numbers): sum = 0 for n in numbers: sum = sum+n*n return sum print(my_func4([1,2,3,4])) def my_func5(*numbers): sum = 0 for n in numbers: sum = sum+n*n return sum print(my_func5(1,2,3,4)) print(my_func5(*[1,2,3,4])) print(my_func5(*(1,2,3,4)))
-
关键字参数:关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。传入的city='Beijing'被组装成了一个dict;而单独的dict可以直接用加的方式调用;关键字参数后不能再添加参数,不然会报错**
def person(name,age,**x): print('name:',name,'age:',age,'other:',x) person('xj',12,city='Beijing') a = {'city':'Beijing','gender':'男'} person('xj',12,city=a['city'],gender=a['gender']) person('xj',12,**a)
-
命名关键字参数:函数参数中'*,'后参数为关键字参数,如果没有输入对应的关键字参数则Python会报错提醒;命名关键字参数必须传入参数名,否则会报错;如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了;命名关键字参数可以有默认值(
city='Beijing'
)def person3(name,age,*x,city='Beijing',gender): print(name,age,x,city,gender) person3('a',12,*['teacher'],gender='男')
-
参数组合:在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数(位置参数)、默认参数、可变参数、命名关键字参数和关键字参数
def f1(a,b,c=0,*d,**e): print('a=',a,'b=',b,'c=',c,'d=',d,'e=',e)
-
递归函数:汉诺塔问题,将n个盘从a搬到b
def move(n,a,b,c): if n==1: print(a,'-->',b) else: move(n-1,a,c,b) print(a,'-->',b) move(n-1,c,b,a)
课程4:高级特性
-
切片:Slice
names = [...,'a','b','c','d'];names[n:N]指取names中的序号为n到N-1的值总共N-n(n,N>0正序)或者N-n+1(n,N<0反序)个量;names[0:2] == names[:2]
也可以按倒序切片:names[-2:]-->['c','d']
间隔取数,names[::n]:所有数每n个取1个;names[:10:2]:前十个数每2个取1个
tuple和字符串都可以进行切片,切片后都是相应的类型
-
字符串s=''时s[0]、s[-1]都会报错,但是可以通过s[:1]和s[-1:]return自身
names = ['a','b','c','d'] print(names[1:3]) numbers = list(range(101)) a = numbers[::5] num_tup = tuple(range(11)) b = num_tup[-5:] num_str = '0123456789' a = num_str[0:5]
-
迭代:Iteration
Python迭代是通过for...in...实现的,相较于java的下标控制迭代更加抽象
list,tuple,dict,set,string都可以迭代。其中dict默认迭代key,value迭代可以使用num.values(),同时迭代key,value使用num.items(),且dict迭代结果顺序很可能不一样。
如何判断一个对象是可迭代对象呢?方法是通过collections.abc模块的Iterable类型判断
-
enumerate函数把list变成序号-元素对,使得在for循环中可以同时迭代序号及元素数据
num1 = [1,2,3,4,5] num2 = (1,2,3,4,5) num3 = {'a':1,'b':2,'c':3} num4 = set([1,2,3,4]) num5 = 'abc123' print(num1,num2,num3,num4,num5) for a in num1:#list print(a) for a,b in enumerate(num1): print(a,b) for a in num2:#tuple print(a) for a in num3:#dict: key print(a) for a in num3.values():#dict: value print(a) for a,b in num3.items():#dict: key,value print(a,b) for a in num4:#set print(a) for a in num5:#string print(a) #判断数据是否可以迭代 from collections.abc import Iterable print(isinstance('ab',Iterable)) print(isinstance(12,Iterable)) print(isinstance([1,2],Iterable)) #for循环中同时迭代两个变量 num7 = [(1,2),(3,4),(5,6)] for a,b in num7: print(a,b)
列表生成式
它是Python内置的非常简单却强大的可以用来创建list的生成式
在list内部使用for循环,dict类型的可以同时迭代两个变量来生成list;
dic1 = [m+'='+str(n) for m,n in d.items()]
;字符串可以同时大小写用lower()和upper()函数-
if...else...放在for循环前面,是对list元素的判定及操作;注意与for循环后面的if判定(对循环内主体的判定)区分;前者相当于对数学函数中的结果的处理(根据x的判定),后者相当于对数学函数定义域的处理
L1 = [x*x for x in range(1,11)] L2 = [x*x for x in range(1,11) if x%2==0] L3 = [x*x if x%2==0 else -x*x for x in range(1,11)] L4 = [x+y for x in range(1,11) for y in range(2,12)] print(L1) print(L2) print(L3) print(len(L4)) import os dir1 = [d for d in os.listdir('.')]#列出当前文件夹下的文件和目录 print(dir1) d={'x':1.'y':2} dic1 = [m+'='+str(n) for m,n in d.items()] dic2 = [m+'='+str(n).upper() for m,n in d.items()] print(dic1) print(dic2)
- 生成器:如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator
把列表生成式中的'[]'改成'()'即可
生成器保存的是一种算法 而不是具体的数据
一个个打印生成的list用next()函数,
g=(x*x for x in range(0,11)); print(next(g));print(next(g))
for循环输出g中的数据,因为generator也是可迭代的;
for x in g:...
复杂函数不能直接用'()'定义出来的话就需要重新定义一个generator函数,关键词用'yield'代替普通函数中的'return'
-
函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
#生成器generator g = (x*x for x in range(0,11)) print(next(g)) for x in g: print(x) #generator函数 def fib(x): n,a,b = 0,0,1 while n<x: yield(b) a,b = b, a+b n = n+1 for x in fib(6): print(x) #10行杨辉三角 def triangles(): n = [1] x = 0 while True: yield n[:]#返回此刻n的全部值后续对n的操作不影响返回值 n.append(0) n = [n[i]+n[i-1] for i in range(len(n))] x = x+1 if x==10: break results = [] for x in triangles(): results.append(x) for y in results: print(y)
- 迭代器
list tuple dict set str包括generator生成器及包含yield语句的函数都是可迭代的(Iterable)或者说可以在for循环中使用的对象类型都是Iterable的;
from collections.abc import Iterable;isinstance([],Iterable);
-->True生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。可以使用isinstance判断一个对象是否是Iterator对象
list tuple str等类型可以通过Iterator包中iter()函数转为迭代器
-
for循环--迭代性Iterable next()---迭代器
#迭代器 from collections.abc import Iterable,Iterator isinstance('abc',Iterable) print(isinstance(iter('abc'),Iterator)) a = iter('abc') while True: try: print(next(a)) except StopIteration: #遇到停止迭代则跳出循环 break
- 高阶函数
函数本身可以赋值给变量:f = abs;
-
函数作为变量传入另一个函数:def abc_a(x,y,f):#f可以是一个函数
#高阶函数 f = abs def num_cal(x,y,f): return x+f(y) print(num_cal(1,-2,f))
- Python内置函数:map()和reduce()
- map()接收两个参数,一个是函数,一个是Iterable量(只能有一层迭代关系,L1 = ['ac','bd']这个不能直接作为输入,得使用L[0]/L[1]作为输入的Iterable量);返回一个Iterator量
- map()返回的量可以通过list把返回的Iterator直接生成列表
- reduce()接收两个参数,将结果继续与序列的下一个元素做累积;
from functools import reduce;
- map可以作为reduce的第二输入参数
#map
from collections.abc import Iterable,Iterator
def f1(x):
return x*x
map1 = map(f1,[1,2,3,4])
print(next(map1))
map2 = list(map1)#直接生成list
print(map2)
print(isinstance(map1,Iterable))
print(isinstance(map1,Iterator))
#map函数返回一个Iterator
L1 = list(map(str,[1,2,3,4]))
#将一个list中的数字转变成str然后再返回一个list
print(L1)
L2 = list(map(str.upper,['a','b']))
print(L2)
#reduce
from functools import reduce
def sum1(x,y):
return x+y
Re1 = reduce(sum1,[1,2,3,4,5])#15
Re2 = reduce(sum1,['a','b'])#ab
print(Re1)
print(Re2)
def math1(x,y):
return x*10+y
Re3 = reduce(math1,[1,3,5,7,9])#13579
print(Re3)
dict1 = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
def char2num(x):
return dict1[x]
reduce(math1,map(char2num,'13579'))#'13579'-->13579
- filter
和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter把传入的函数依次作用于每个元素,然后根据返回值True还是False决定保留还是丢弃该元素
-
filter返回的也是一个Iterator,同样可以用list(filter(f,a))的方式将其保留到一个list中
#filter def is_odd(x): return x%2==1 Od = filter(is_odd,[1,2,3,4,5,6,7,8,9]) print(list(Od)) #filter练习 输出1-1000中的回数 121 242 131等 def numb1():#全体整数1-1000 n = 1 while True: n = n+1 yield n if n>=1000: break def num_rev(x):#整数的倒序 x1 = str(x) n = len(x1) x2 = 0 for n1 in range(n): x2 = x2+int(x1[n1])*10**n1 return x2 def is_palindrome(x): return x==num_rev(x) L_fi = list(filter(is_palindrome,numb1())) print(L_fi)