漫谈python基本语法
python环境安装
古语有云:“工欲善其事,必先利其器”。所以你想进行python编程的话,你必须要有python的编译环境。(当然在线编译器也不是不可),这个自己可以在网上去搜寻,挺多的。我个人推荐pycharm+anaconda。
python的基本语法及基本操作
ps:下面我按照《python编程------从入门到实践》partⅠ的目录来简要的说明一下python的基本语法以及简单的操作,顺便巩固一下自己的知识架构
chapter01.变量和简单的数据类型
-
在python中没有繁琐的定义变量的过程,想用什么直接定义就可以了,如:
message='i love python'
这个message就可以直接定义就可以了,总之python定义变量还是比较简单的
-
python中还是对变量的名称还是有一定的要求的:变量名只能包含字母,下划线和数字,可以以字母和下滑线打头但是不能以数字打头;变量名中不能出现空格,但能使用下划线来分隔其中的单词;不要将python关键字和函数名用作变量名;变量名需要简洁而且带有描述性;慎用小写字母l和大写字母O,这样可能会被误认为数字0和1
-
字符串可以是直接用引号括起的,引号包括单双引号
-
如果你需要在字符串中用到变量,那么就需要用到这个
f'其他的字符串{变量}其他的字符串'
需要注意的是f语法是python3.6引进的,其之前的版本是format(),format的语法是
'{} {}'.format(变量,变量)
然后将花括号依次替换为后面的变量,看起来还是比较麻烦的。
-
在python中带有小数点的称为浮点数
-
两个数相除,无论除数和被除数是否为整数,所得的结果都是浮点数
-
在python中
**
表示乘方运算,如3**2
结果为9 -
如果一个数很大,可以在数于数之间加上下划线以便区分,如1_000_000
-
python还支持同时赋值
x,y,z=1,2,3
-
python中的注释为
”#“
chapter02.列表简介
列表,简单的来说就像是c中数组,如:
list=['python','c','java']
简单来说像出现了[ ]的这种一般就是列表,同时这也是列表的一种特征
- 遍历列表
lists=[1,2,3,4]
for list in lists:
print(list)
-
访问列表元素直接列表名[索引]
-
index(索引)是从0开始的,不是从1开始,类比C语言等其他语言
-
添加元素:调用append()方法
list.append('Helloworld')
-
插入元素:insert(索引,插入的字符or数字)方法
list.insert(0,'hello')
-
删除元素:remove(),pop(),del
list.remove('hello') #hello字符被删除 list.pop() #最后元素被弹出,当然也可以指定index,弹出的元素可以被访问 del list[index] #index是索引
-
对列表排序:调用sort(),只是临时排序的化调用sorted()函数,当然也可以对排序的列表进行逆序处理,在其中加入reverse=True的参数
list.sort() sorted(list) # 逆序 list.sort(reverse=True)
-
逆序:直接调用
reverse()
方法 -
求长度调用函数:len()函数
chapter03.操作列表
遍历在chapter02以及说过了,这里就不说了。
-
创建数值列表:
利用range函数,range(1,6)表示1–5,不包括6。range()函数在for循环中用到的很多。
for i in range(1,10): print(i)
这里就会打印1到9.
对于创建数值列表,可以直接使用
list()
函数来将range()
函数来转化为列表list=list(range(1,3))
结果是:[1,2],这样就算是创建了一个列表
同时range函数可以指定步长,就是相当于公差,一般是1,这个你可以自己指定。
-
对列表进行一些简单的操作
min()找min,max()找max,sum()求和
-
使用切片操作对列表进行遍历或相关操作:
如:
list=['a','b','c'] print(list[0:2])
结果:[‘a’,‘b’]
那么就会到原list列表进行切片操作,第一个参数是起始位置,第二个是结尾位置(不包括),其实还有第三个参数:步长;总的来说类比range就行。
列表名[ : ]
就是整个列表总的来说,列表的切片还是用的比较频繁的。
-
复制列表
list=[1,2,3,4]
lists=list #这样复制的话,lists其实就是lists是list的别名,当lists被改变时,list也会改变
为解决上述问题,推荐利用切片来进行复制,这样的话就是重新创建一个新的列表,并且和被复制的列表一样
list=[1,2,3]
lists=list[:]
列表讲述完了,下面简述一下元组
元组其实和列表很想,但是元组是使用的小括号(),而且元组的元素是不允许修改的(元组就是不可以被修改的列表),只能被重新赋值
list=('hello','world')
这就是一个简单的元组,当你尝试去修改时就会出现traceback,因为元组是不可以被修改的,想修改的话就只能赋值
list=('HELLO',"WORLD")
当然单个修改也是可以的。
chapter04.if语句
其实这个没有什么好说的,大部分的语言都是有的,这里展示一下基本格式
a=10
if a>5:
print('a是大于5的')
else:
print('a小于5')
这就是其的基本格式。当然需要用到多个分支的话,可以利用elif这个关键字
python中的if语句还是比较便捷的,这里提一种
list=['a','b','c']
if 'a' in list:
print('在列表中')
else:
print('不在')
还是比较人性化的。其他的相关操作也类似,简单的看下就行
chatper05.字典
其实就是一个键值对,一个键对应一个值
people={
'name':'HelloWorld',
'address':'HuNan'
}
这个就是一个简单的字典
如果你想访问字典中的一个键所对应的值:你可能是这么访问people[‘phone’],这样访问是没有问题,但是phone这个键没有就会出错,所以一般推荐利用get( )
方法,譬如:people.get(‘phone’),当字典中没有这个键的时候就会返回None,当然你也可以在get的第二个参数中写没有,返回的说明。
利用items()的这个方法可以返回键和值
for i,j in people.items():
print(f'{i}:{j}')
同样,如果你想用到键,调用keys()方法;对于值的话,调用values();这两种其实是返回一个列表,如果你想其中没有重复的元素,可以调用set()函数,那么就会不含重复的元素
最后就是字典的相关嵌套,很简单,自己试试就行
chatper06.用户输入和while循环
对应任何一个程序,总是需要输入的。python也不例外,可以通过input('解释性语言')
来进行输入的操作
这里需要注意的是,所有输入的都是字符串,如果需要用到数值,利用int()等函数进行转化即可
然后对于while循环其实没什么好说的,和其他的编译语言大同小异
简单的说一下格式:
while True:
print('hello')
嗯,就是这样。
当然像break,continue这个关键字python中也是可以用的
chapter07.函数
python中也是支持函数的
格式:
def name(first,last):
long_name=f'{first} {last}'
return long_name
这个就是基本的格式,当然也可以不需要return,这个也不是必须的
python中在向形参传递参数的时候不一定需要按照顺序进行传递,你可以通过关键字实参来进行解决:
name(last='world',first='hello')
就是这样。
python中还支持形参的默认值,当实参未传递该参数的时候,那么就直接利用这个default,如果传递了的话,就利用传递的值:
def name(first,last='world'):
long_name=f'{first} {last}'
return long_name
还用就是当实参中传递了多个参数(多个实参),那么在函数就必须是这样:
def name(*test):
xxxxxxxxx
xxxxxxxxx
这里*test,其实创建一个test的元组来存储这些数据。
如果传递的是多关键字实参的话,那么函数就是这样:
def name(**test):
*********
*********
这个其实是创建一个test的字典,来存储关键字实参,键值互相对应关键字(嗯,应该是这个意思)
最后就是导入函数模块:
首先创建一个只有函数的模块,然后新建一个.py的文件,在这里面导入就行,导入的方法有这么几种:
-
导入整个模块:import modul_name,在引用的时候这样使用modul_name.function_name()
-
导入单个函数:from modul_name import function_name,这样直接调用这个函数就行了
-
导入多个函数:from modul_name import function_name,function_name1(),…
-
导入所有的函数:from modul_name import *
然后可以通过as关键字来对function_name or modul_name进行重命名,便捷操作
chapter08.类
python也能面向对象编程,所谓面向对象就是通过定义对象的行为来进行编程,可以提高工作效率。
学习这个的同时可以通过java中一些概念来进行理解
格式:
class Test:
def __init__(self,name,age):
self.name=name
self.age=age
def sit(self):
print(f'{self.name} is now sitting')
def roll_over(self):
print(f'{self.name} rolled over')
一般来说,类是需要大写的,在类的定义的看着和函数很像的叫”方法“,一般是必须有__init__(self,其他的参数)
,init前面和后面都有两个下划线,这是一个特殊的方法,在创建实列的时候,python一般会先执行这个方法,这个方法一般都是为属性(属性就是创建实例之后可以被使用的变量)进行赋值;另外在每一个方法的参数中__self__这个参数是必须需要的,但是通过实参传递的时候不需要向这个参数传递参数,因为self会自动传递
创建实例:test=Test('hello',19)
,就是这样来进行创建, 然后就可以通过test来进行访问class中的方法了。
有些属性无需通过实参向形参传递,可以在__init__(self)
中直接将属性赋值为一个default的值
然后既然是可以创建类,那么就存在继承,父类又叫超类(superclass),继承的方法很简单,就是class Test(父类名)
,这样就可以了。像java中一样,python中也存在super()
这个函数,用于在子类中调用父类的方法。一般就是在__init__(self)
这个方法中用到。
对应继承的父类的方法如果不满足其需求,可以将其修改,也就是重写,很简单,直接重新写一遍即可。然后调用的时候会调用这个被重写的这个方法。
最后就是导入class
可以直接参考前面的函数那里,将function_name替换为class_name即可。
chapter09.文件和异常
对文件的读写操作,w写,a附加,r读,r+读写
对应读写文件直接调用open(文件位置)
函数,open函数不加参数的话默认就是只读模式,当其访问文件是会返回这个文件的对象的,然后将其赋给某一个变量。
with open(filename) as file_object:
就像这样,如果像读文件的话,直接用read()
方法,如content=file_object.read()
,然后打印content即可,但是这样可能会出现空行这种东西,这个其实是因为read()
方法处理的时候,将文件后面的一个空字符串给读入了,然后反应出来就是一个空行。处理的话其实很简单,直接利用strip()
方法就可以了(针对于content);对于读文件,其实也可以直接用那个表示文件的对象(file_object),还有就是利用readlines()函数来进行处理,这个是每读一行然后将其存到一个列表中去。
写文件的话,在open函数中添加第二个参数即可,也就是’w’,然后利用write()方法来进行写入,如:
with open(filename,'w') as f:
f.write('hello,i love python')
这样的话就可以写入了,注意:如果不存在文件的话,就会创建一个文件;反之,写入,但是会覆盖原文件的内容;
对于附加模式,也就是不覆盖原文件,写入的内容会直接添加到后面,不会覆盖。
对于异常处理,也就是来处理一些错误的,像除数为0,找不到文件等等,这种主要就是利用try-except
这个代码块:
x=5
y=0
try:
print(x/y)
except ZeroDivisionError:
print('you can not divide by zero')
大致的格式就是这样,其实还有else
的这个模块,用来表示没出异常时执行的分支。
当使用了try-except-else
代码块之后,出现了异常就不会出现traceback,仍然可以执行,也就是执行except这个分支的语句,如果你不想在user面前展示,那么利用pass关键字直接静默掉,这样user就看不到了,这就是异常的处理了。
最后就是存储数据,建议利用json这个模块来进行存储,.json的文件格式可以被多种语言所调用,便于和使用其他编程语言的人分享。
json.dump()
json.load()
这两个来进行存储和访问。
dump方法需要两个参数,一个存储的数据,二是表示文件个那个对象(像之前的那个file_object),如:
import json
with open('test.json','w') as f:
json.dump('hello',f)
嗯,这样就可以写入了
对于load方法,只需要读取文件对象即可
import json
with open('test.json') as f:
mid=json.load(f)
print(mid)
这样也就行了。
还有就是对于文件路径:相对和绝对:
相对也就是相对于打开的文件而言的,相当于把此时的目录作为根。绝对就没什么好说的了,从根目录开始写即可
windows下路径用反斜杠\
,同时也得注意转义字符,所有一般还是利用两个反斜杠\\
chapter10.测试代码
这个其实也就是测试编写的代码是否能过通过样例,有点类似用oj上判题的那种
一般来说,测试就是手动的;但是python提供了一个高效的方法。
下面来说一下如何编写测试代码,
首先导入unittest,然后导入这个函数or类,然后开始编写class,并且继承unittest.TestCase这个父类;然后编写方法,这个方法必须以test_xxxxx的这种格式,然后再测试时python会自动调用test_开头的这些方法,如果是需要测试的是类,建议先编写setUp(self)
这个方法,这样就可以来减少创建的多个实例的麻烦,尤其是存在多个测试的时候,简单而言也就是将实例用作属性。在这些方法中调用被测的函数,来和已知的结果进行比较,通过unittest中自带的一些方法,如:
方法 | 用途 |
---|---|
assertEqual(a,b) | 核实a==b |
assertNotEqual(a,b) | 核实a!=b |
assertTrue(x) | 核实x为True |
assertFalse(x) | 核实x为False |
assertIn(item,list) | 核实item在list中 |
assertNotIn(item,list) | 核实item不在list中 |
然后调用即可:
name.py
def name1(first,last):
sen=f'{first},{last}'
return sen
test.py
import unittest
from name import name1
class Test(unittest.TestCase):
def test_name(self):
mid=name1('hello','world')
self.assertEqual(mid,'hello,world')
if __name__=='__main__':
unittest.main()
这也就是一个基本的格式,类也是差不多,依葫芦画瓢。
对于下面个__name__
=='__main__'
解释一下,当test.py以主程序执行时那么这个就需要等于__main__
,如果被测试文件导入,那么就不能等于__main__
,也就不能去执行unittest.main()。
好了,到这里总结也就告一段落了,可能写的也不是很好,但是这也是我现在对python的一点小总结,小理解,有问题还请海涵。