赞
踩
大家好,给大家分享一下高中python语言常用语句,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!
这篇文章主要介绍了高中生学python从哪里学起,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下python技术开发高级证书。
目录
python基础的数据类型只有int , float , string(python中简称str) , complex(复数)以及bool类型。注意:是string而不是char
但是严格的来说:python的数据类型是有六种:数字(Number),字符串(str),元组(Tuple),列表(list),字典(dict),集合(set)
所以,可以用int(a),float(a),str(a),bool(a) 将a分别强转为int类型,float类型,string类型,bool类型快码论文。
python不像c/c++,定义需要int xx;python的定义只需要写a=xxx,会根据xxx的类型自适应。
- a=1 #定义a为整形,并且赋值为1
- a=1.3 #定义a为浮点形,并且赋值为1.3
- a="ab2ba" #定义a为字符串形,并且赋值为ab2ba
- a=True #定义a为bool形,并且赋值为True
- a,b=1,2 #定义a和b均为整形,并且赋值为1,2
另外:python行末没有分号,一行只有一句话,并且没有大括号。
- isinstance(a,类型)
- #检查a是否是该类型,若是返回true,若不是返回false
- 例如:
- a=1
- isinstance(a,int) #则返回true
- isinstance(a,str) #则返回false
类似于C语言的scanf() ,python的输入是input()函数,但是要注意输入的是默认为string类型。
a=input() #输入a的值(默认为string类型)
要想输入不是string类型的也可以,但是需要运用到强转:
- a=int(input()) #输入整数
- b=float(input()) #输入浮点数
- c=bool(input()) #输入布尔值
但是对于平时我们刷题目,那种一行有多个数据的这样输入就会RE了,因为python输入完了是会自动换行的,而不是空格。
那么,要想一行多个输入该怎么办呢?
首先,介绍一个库函数:split()。
split()函数表示对字符串进行分割。例如:
- a="123242521"
- b=a.split('2')# 在字符串a中以'2'为标准,进行分割
- print(b)# b自动适应成列表(数组)
- # b为:1 3 4 5 1
- # 如果括号里面没有东西,就默认按照空格,换行,制表符进行分割。
由于input()输入的机制是默认为字符串,所以对一行进行多个输入方式如下:
a,b,c=input().split() #输入a,b,c的值(默认为string类型)
那么又怎么将输入的数据换成int类型呢?要是一行一行的去强转,那太复杂了。
这又不得不提到一个新的函数。map()。STL狂喜
map(函数,序列1,序列2.....) 它的目的是将后面的n个数(序列),依次作用于前面的那个函数。并且返回的是迭代器,也就是地址 (STL狂喜)。
所以,要是想要输入一行整数,就可以这样:
- a,b,c=map(int,input().split())# 定义a,b,c,并且输入他们的值
- #其中第一个int表示int()函数,即强转为int类型
- #第二个input().split()即输入的序列
- #所以这个意思就是输入一些数,并且将他们都强转为int类型
但是这样是对单个数据进行输入,那怎么去对数组进行输入呢?
刚刚我们提到了,map函数返回的是迭代器,也就是地址,所以我们需要新建立一个 序列:列表 list() 去强转并接收它。即
- a=list(map(int,input().split()))# 定义数组a,并输入值
- #由于map返回的是迭代器,所以用list来接收,并存储。
python实现多组输入的方式为:
- while True:
- try:
- a,b=map(int,input().split())
- except:
- break
类似与C语言的printf(),python的输出是print()函数。例如:
- print("12345") # 输出12345
- print(1+2) # 输出3
- print(1.1+2.1) #输出3.2
- print("1"+"2") #输出12
- print(1*3) #输出3
- print("1"*3) #输出111
- print("\n") #输出换行
但是特别要注意,python的输出是默认自带换行的,要想不默认带换行,可以这样
- print(a,end='')
- print(a,end=' ')#a后面带有一个空格
- print(a,end='\n') #a后面换行,当然也可以直接print(a)
如果说,要让python规定输出带有小数点位数,可以这样:
- a,b=1.2,0.5
- print(f"{a:.2f}") #结果为1.20
- print(f"{a-b:.2f}") #结果为0.70
- #其格式为:f"{参数:保留位数}"
python的运算符其他编程语言类似,均有+,-,*,/,%。
不过需要特别注意的是+还可以是字符串的拼接,例如:"aa"+"bb"="aabb",并且 / 是会有小数点的,也就是不会像c语言那样向下取整。如果想要向下取整,可以 // 来表示,例如:3 / 2 =1.5,3 //2 =1,同样,有 // 那也会有 **,**表示幂,例如:5**3=5*5*5=125。
有基础运算符,那必然也会有 +=,-=,*=,/=,%=,//=,**=。但是python却没有++和--。
比较操作符即:>,<,>=,<=,==,!= 。
c语言的逻辑操作符是&&,||,! 。而在python中则是 and,or ,not。
和其他编程语言类似,优先级为:幂 > 正负号 > 乘除 > 加减 > 比较操作符 > 逻辑运算符
在python中,if语句后面不需要括号,只需要一个冒号,然后换行对齐即可。
并且else if可以简化为elif 。例如:
- if a>b :
- print(a)
- print(b)
- elif b>c :
- print(b)
- else :
- print(c)
但是 python 有其独特的三目运算符,不再像C语言那样的 ? :
python的三目运算符为:
maxn=b if b>c else c #即 maxn=a>b?a:b;即maxn=max(a,b);
和if语句一样,while语句后面也不需要括号,只需要一个冒号,然后换行对齐即可。
例如:
- a=1
- b=1
- while a<10:
- a+=1
- b+=2
- print(b) #输出19
这里先提到一个range函数,range函数的本质是一个迭代器。在for循环里的用法为:
- for i in range(a,b,c) :
- #相当与for(int i=a;i<b;i+=c){}
- #当然,range()函数也可以不用写三个参数,如:
- for i in range(a,b) :
- #相当于for(int i=a;i<b;i++){}
- for i in range(b) :
- #相当于for(int i=0;i<b;i++){}
另外,python的for循环可以遍历字符串,即
- s="abcd"
- for i in s:
- print(i,end=' ')
- #输出为a b c d
和c语言数组不同的是,python的数组叫做列表,和c++ STL的list有点类似,它是一个动态的链表,并且里面存储的可以是不同类型的数据。
- arr1=[1,2,1.3,'aa',True] #定义一个列表
- #甚至还可以套娃
- arr2=[1,2,[1,2,3]]
- arr3=[[1,2,3],[4,5,6],[7,8,9]] #定义二维列表
- arr4=[[1,2,3],
- [4,5,6],
- [7,8,9]] #这样也是定义二维列表
- print(arr1) #将会直接输出整个数组 [1,2,1.3,'aa',True]
增
1)arr.append(),类似于STL的arr.push_back(),即尾插。但是只能尾插一个数据
2)arr.extend(),特别注意:extend()也可以尾插另一个列表。即:arr.extand(['a','b']):尾插'a'和'b'两个数据。
3)arr.insert(),类似于STL的insert(),即可以在任意一个位置插入元素。用法为:arr.insert(位置,元素)同样,insert也可以插入另一个列表。例如:arr.insert(2,3) 即在第二个位置插入3这个数据。
删
1)按照位置来删除 arr.pop()
和STL的pop()不同的是,它可以选择删除的位置。用法为:arr.pop(位置)。例如:arr.pop(2) 即删除第二个位置的数据
2)按照数据来删除 arr.remove()。用法为:arr.remove(数据) 。例如:arr.remove(2) 即删除数据2 但是要注意,存在多个2的时候,删除的是第一个2
3)当然也可以使用arr.clear()一键清空。
查
列表的访问也可以直接按照下标的方式,也可以使用库函数查找下标及数量。
- arr=[12,13,14,15,16]
- #arr[0]=12,arr[1]=13
- #arr[len(arr)-1]=16
- #arr[-1]=16,arr[-2]=15
-
- arr.count(数据) #查找该数据有多少个
- arr.index(数据) #查找该数据的下标
改
列表的改数据,可以直接按照下标的方式进行修改
- arr=[11,12,14,14,15]
- arr[2]=13 #将下标为2的数据修改为13
其他库函数
- arr=[14,13,19,17,15]
- arr.sort() #对列表从小到大排序
- arr.reverse() #将列表倒序
- arr.sort(key=cmp) #按照cmp函数的方式进行排序
元组是一种弱化版的列表。它一旦被赋值了,就不能再做任何的修改,即增,删,改。但是元组还是可以切片的。
元组的定义方式是用小括号:
Tuple=(1,2,3,4) #定义一个元组
字符串的库函数和列表的库函数类似。列表的库函数在字符串中同样适用,可以大致理解为字符串就是列表,只不过全是字符而已。
“字典这个数据结构活跃在所有Python程序的背后,即便你的源码里并没有直接用到它。”
顾名思义,字典是一种类似于《字典》的数据结构(或者说序列)。例如查找 abandon 我们知道意思是 放弃 。
因此字典是一种对应的映射关系,也就是键值对,通过查找键,获取该键对应的值。
dict1={键1:值1,键2:值2...} #字典的格式
通过表示键可以获取值
- num={"one":1,"two":2} #定义字典
- print(num["one"]) #打印结果为1
当然,字典的表示是这样,但是定义方式却不止这一种,但是无论哪种定义方式,表示的方式只有一种。
- dict1={键1:值1,键2:值2,键3:值3...} #按照表达方式定义
- dict2=dict(键1=值1,键2=值2,键3=值3...) #利用dict函数强转,但是这里要注意键不管是不是str类型,都不要引号
- dict3=dict([(键1,值1),(键2,值2),(键3,值3)...]) #利用dict函数以及列表的方式定义
- dict4=dict(zip([键1,键2,键3...],[值1,值2,值3...])) #利用dict函数以及zip函数定义。
除了以上死板的定义方式外,还可以利用库函数:dict.fromkeys()快速创建字典
- a=dict.fromkeys("123","13")
- b=dict.fromkeys("123",13)
- #快速创建的字典a为 {'1': '13', '2': '13', '3': '13'}
- #快速创建的字典b为 {'1': 13, '2': 13, '3': 13}
增
字典可以直接添加,添加方式为: 字典名[新的键]=值。
- a={"one":1,"two":2} #定义字典
- a["three"]=3 #向字典添加元素
- #这时候字典为: {"one":1,"two":2,"three":3}
删
删除字典的元素需要用到函数:字典名.pop(键) 那该键值对就删除了
- a={'one': 1, 'two': 2, 'three': 3}
- a.pop("two")
- # a为 {'one': 1, 'three': 3}
字典也有库函数:字典名.clear() 可以做到删除整个字典
查
在之前提到了,可以直接利用字典的键来查找值
也可以利用库函数:字典名.get(键,"备注的文字") 。当没有该键的时候,返回的就是备注了
当然,字典在查找的同时还可以新增元素:字典名.setdefault(键,值)。当有键的时候返回值,当没有键的时候就新增一个键值对
字典还有三个查找的库函数:字典名.items(),字典名.keys(),字典名.values()。他们分别查找的范围是 键值对,键,值。
改
字典的修改方式可以直接修改,即:字典名[已经有的键]=新的值
- a={"one":1,"two":2,"three":4} #定义字典
- a["three"]=3 #修改字典
- #这时候字典为: {"one":1,"two":2,"three":3}
也可以利用库函数:字典名.update(另一个字典) 进行更新修改,当然,如果原来没有键,那么将会增加新的键值对
集合就和高中或者说集合论学的那种集合一样。具有同样的性质:确定性,互异性以及无序性。
a={"12","34"} #定义集合a
下面以列表的切片为例,但是字典和集合没有切片操作。
列表切片可以说是一种表示方式,可以很方便的获取一个或多个数据
列表切片的原理还是基于for循环的方式。
- 列表切片为:arr[a:b:c],类似于
- for(int i=a;i<b;i+=c) {
- printf("%d",arr[i]);//cout<<arr[i];
- }
- 或者说
- for(int i=a;i>b;i-=c) {
- printf("%d",arr[i]);//cout<<arr[i];
- }
- 会自动根据c的值采用相应方式,若c>0则是第一种,若c<0则是第二种
有时候为了方便,a的值默认为0,即当a=0的时候可以不写出,b的值默认为len(arr),即当c=len(arr)的时候可以不写出,c的值默认为1,即当c=1的时候,可以不写出。
例如:
- arr=[12,13,14,15,16,17,18]
- print(arr[0:5:2]) #输出[12,14,16]
- print(arr[0:3]) #输出[12,13,14]
- print(arr[3:5]) #输出[15,16]
- print(arr[:3]) #输出[12,13,14]
- print(arr[3:]) #输出[15,16,17,18]
- print(arr[:]) #输出[12,13,14,15,16,17,18]
- print(arr[::2]) #输出[12,14,16,18]
- print(arr[::-1]) #输出[18, 17, 16, 15, 14, 13, 12]
- print(arr[6:2:-1]) #输出[18, 17, 16, 15]
- print(arr[6:1:-2]) #输出[18,16,14]
之前提到插入数据是用extend或者insert函数,删除数据是pop或者remove函数。由于列表的灵活性,所以也可以采用切片的方式插入数据,删掉数据,改数据。
- arr=[12,13,14,15,16,17,18]
- #-------分------界------线--------
- arr[len(arr):]=[19,20] #尾插[19,20]两个数据
- arr[:0]=[9,10] #头插入[9和10]两个数据
- arr[2:2]=[11] #在第2个位置插入11这个数据
- arr[3:3]=[11,12,12] #在第3个位置插入11,12,12这三个数据
- #-------分------界------线--------
- arr[len(arr)-1:]=[] #尾删
- arr[:1]=[] #头删
- arr[3:4]=[] #删掉下标为3的数据
- arr[2:4]=[] #删掉下标为2和3的数据
- #-------分------界------线--------
- arr[len(arr)-1]=20 #将最后一个数替换为20
- arr[len(arr)-1:len(arr)]=[19] #将最后一个数替换为19
-
- arr[:1]=[9] #将第一个数替换为9(下标为0)
- arr[1:2]=[10] #将第二个数替换为10(下标为1)
- arr[2:5]=[11,12,13] #将第三个到第5个数替换为11,12,13
-
- print(arr[:])
下面以列表的切片为例,但是字典和集合没有运算操作。
1)加法:序列的相加,相当于字符串的拼接。
- arr1=[1,2,3]
- arr2=[4,5,6]
- arr1+arr2 #[1,2,3,4,5,6]
- tuple1=(1,2,3)
- tuple2=(4,5,6)
- tuple1+tuple2 #(1,2,3,4,5,6)
- str1="123"
- str2="456"
- str1+str2 #'123456'
2) 乘法:序列的乘法也类似于字符串的拼接
- arr,tuple,str=[1,2,3],(1,2,3),"123"
- arr*3 #[1,2,3,1,2,3,1,2,3]
- tuple*3 #(1,2,3,1,2,3,1,2,3)
- str*3 #'123123123'
- list(a) #将a强转为列表形式
- tuple(a) #将a强转为元组形式
- str(a) #将a强转为字符串形式
所以在之前对数组进行输入的时候是这样的:
a=list(map(int,input().split()))
即max()函数和min()函数
- maxn=max(a) #如果a是一个序列,则返回a中的最大值,如果是字符则对应ASC||表
- minn=min(a) #如果a是一个序列,则返回a中的最小值,如果是字符则对应ASC||表
计量函数即:len(),sum(),count()
- len(a) #返回a的长度,但是超过2的31次方位的数 会报错
- sum(a) #将序列中的数全部加起来,也就是求和
- #例如sum([1,4,7])=12
- sum(a,start=y) # 求和之后再加个y
- a.count(y) #count在前面提到过,即在序列a中查找y有多少个
排序函数:sorted(a,key=函数) a代表序列,key代表方式。如果没有key则默认从小到大排
翻转函数:reversed(a) a代表序列
但是不管之前是什么序列,返回的结果统一会变成列表
特别注意:之前提到了a.sort(),a.reverse() 这里的a只能是列表
类似于C的函数,C是void 而python则是def。
- #函数的模板为:
- def 函数名(形式参数):
- 函数内容
- #return 可以有return也可以没有
- 函数名(实际参数)#调用该函数
特别注意的是,这里函数的参数,没有int等的定义,会根据传入的参数自适应。
- #斐波那契递归
- def f(a):
- if a==1 or a==2: return 1
- else: return f(a-1)+f(a-2)
-
- a=int(input()) #输入a
- print(f(a)) #调用函数并输出
位置参数就和我们所理解的函数概念一样,也就是形式参数与实际参数在数量和位置上必须一一对应。
关键字参数是利用形参的名字来输入实参。关键字参数和位置参数不同的是:关键字参数的位置可以不用一一对应,只要将参数名写正确即可。
- def fun(a,b):
- print(a+" "+b)
- fun("123","321") #位置参数
- fun("123",b="321") #关键字参数
- fun(b="123",a="321") #关键字参数
- # 运行结果为: 123 321
- # 123 321
- # 321 123
但是要注意的是,关键字参数必须在位置参数的后面。而位置参数是要对应的。
默认参数是指在定义函数的时候,就已经给形式参数一个初始值(默认值),所以叫默认参数。当然后续的实参可以修改已经有了的初始值。
也就是说有了默认参数以后,就不用像位置参数那样数量对应了,例如一个函数有4个参数,其中2个默认参数,那么实参只需要至少2个,至多4个就行。
- def fun(a,b,c="234",d="432"): #其中c和d即为默认参数
- print(a+" "+b+" "+c+" "+d)
- fun("123","321")
- fun(b="123",a="321")
- fun("123","321","324")
- # 运行结果为: 123 321 234 432
- # 321 123 234 432
- # 123 321 324 432
这个和指针有点类似。函数的形式参数是带有*号的。
- def fun(*args):
- print(args)
- fun(1,2,3,4,5)
- # 输出结果为 (1, 2, 3, 4, 5) 注意是元组
也就是说,当形参带有*号,那么传入的数据将以元组的形式储存。
这种情况,如果说形式参数还有其他的数据。那么必须以关键字参数的形式传入,不然全部均储存在args中
- def fun(*args,b):
- print(args,b)
- fun(1,2,3,4,5,b=6)
- # 输出结果为 (1, 2, 3, 4, 5) 6
- # 注意b是int类型并非元组
- fun(1,2,3,4,5,b=tuple(str(6))) #输出为 (1, 2, 3, 4, 5) ('6',)
- # 由此可见,args是独立的
同样的,函数也可以一次性返回多个值,当返回多个值的时候将以元组形式暂时储存。
- def fun():
- return 1,2,3,4,5
- a=fun()
- print(a) #输出结果(1, 2, 3, 4, 5)
不仅如此,可变参数也可以有两个*号,即**kwargs 这个时候储存的结果就是字典了
- def fun(**kwargs):
- print(kwargs)
- fun(a=1,b=2,c=3)
- # 输出结果为: {'a': 1, 'b': 2, 'c': 3}
混合参数即上述的各类参数形式可以混合使用,但是要注意先后顺序:位置参数-->可变一维参数(*args)-->默认参数-->关键字参数-->可变二维参数(**kwargs)
- def fun(a,b,*c,d="100",e="100000",f,**g):
- print(g)
- print(f)
- print(e,d)
- print(c,b,a)
- fun(1,2,3,4,5,6,d=7,f=8,g=9,h=10,i=11)
- # 打印结果为 {'g': 9, 'h': 10, 'i': 11}
- # 8
- # 100000 7
- # (3, 4, 5, 6) 2 1
闭包就是能够读取其他函数内部变量的函数。例如在java中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
- def 外部函数():
- def 内部函数():
- print(123)
- return 内部函数 #<----这里划重点,是返回名字而不是函数
- #像这样就是闭包函数
闭包是外部函数 返回 内部函数。所以按照正常的想法,我们调用外部函数,会返回内部函数,从而执行内部函数。然而我们直接打
外部函数() #这样去调用外部函数
实际上没有效果。因为在之前,是return的内部函数的名字,而不是函数。所以直接调用没有用。
那该怎么去调用呢?
- def 外部函数():
- def 内部函数():
- print(123)
- return 内部函数
- fun=外部函数() #在这里,运行代码,实际上就是fun=内部函数
- fun() #所以这里实际上就是内部函数(),于是就完成了调用
像这样,再起一个函数fun让他等于外部函数() 然后调用fun()才行。
闭包的意义是减少调用的参数数量。
例如:输出x+y。当y都是同样的值的时候,每次调用还需要输入y,这样就显得麻烦。
- def fun(x,y):
- print(x+y)
- fun(x1,y)
- fun(x2,y)
- fun(x3,y)
利用闭包,可以先储存y的值,然后每次只需要调用x就行。
- def 外部函数(y):
- def 内部函数(x):
- print(x+y)
- return 内部函数
- fun=外部函数(y)
- fun(x1)
- fun(x2)
- fun(x3)
闭包会让程序变得更简洁易读
设想一下,有没有一种可能,我们可以把某个函数作为另一个函数的参数进行调用。
那答案是肯定的。
- def 另一个函数(func):
- func(2,3)
- def 某函数(a,b):
- print(a*b)
-
- 另一个函数(某函数)
- #像这样,结果就是6
如果我们以闭包的形式,让闭包的参数是某函数,写一段代码:
- import time
- def 外部函数(func):
- def 内部函数():
- start=time.time()
- func()
- end=time.time()
- print(f"函数调用的时间是{end-start:.10f}秒")
- return 内部函数
- def 某函数():
- time.sleep(2)
-
- fun=外部函数(某函数)
- fun() #结果自然是2.xxxxxxxxx秒,会根据电脑不同后面数值不同。
当然,这是一种闭包的情况,假设说有多个闭包,都是调用该函数,那我们岂不是要打多行代码去调用闭包了?
实际上可以将上述代码简化如下:将fun=外部函数(某函数)删去,改为@外部函数,写在定义函数的前面。
这时候直接调用某函数,会自动进行闭包。
- import time
- def 外部函数(func):
- def 内部函数():
- start=time.time()
- func()
- end=time.time()
- print(f"函数调用的时间是{end-start:.10f}秒")
- return 内部函数
-
- @外部函数
- def 某函数():
- time.sleep(2)
- 某函数()
当然也可以写多个@
- import time
- def 外部函数1(func):
- def 内部函数():
- start=time.time()
- func()
- end=time.time()
- print(f"函数调用的时间是{end-start:.7f}秒")
- return 内部函数
- def 外部函数2(func):
- def 内部函数():
- start=time.time()
- func()
- end=time.time()
- print(f"函数调用的时间是{end-start:.10f}秒")
- return 内部函数
-
- @外部函数2
- @外部函数1
- def 某函数():
- time.sleep(2)
- 某函数()
像这样以@的形式表示闭包,就是函数装饰器。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。