Python基础语法

##-*- coding: utf-8 -*- #如果不加上这一行,文件中就不能包含中文


#---------------------------------------------------------------------#
##python编写规范
#不要混合使用制表符和空格,尽量都用制表符,但是要设置编辑器将制表符当做四个空格
#行长不要超过80个字符,注释的行长不超过72个字符
#给形参指定默认值时,以及使用关键字实参时,等号两边不要有空格
#定义函数时若形参太多需要换行,需要缩进两个制表位以跟函数体的缩进区分
#类的命名不使用下划线,而是首字母大写;实例名和模块名全部小写,并在单词之间用下划线
#每个模块、类都应该包含文档字符串
#---------------------------------------------------------------------#


print("hello,world")

#可以使用字母、数字或下划线作为变量名或函数名,但不能以数字为首



#----------------------------------------#
#---------------string-------------------#
#----------------------------------------#

#字符串可以用单引号或者双引号括起,这种灵活性允许了在字符串中包含单引号或者双引号
string1="you're late"
string2='He said:"Don\'t go out."'
print(string1)
print(string2)
#更改大小写
name="cyan zheng"
print(name.title())
print(name.upper())
print(name.lower())
#合并字符串
print(name.title()+", "+string1+"|")
string1+='add something'
#按空格分割单词
string1.split() #split会将结果储存在一个列表中
#添加空白(包括空格、制表符和换行符)
print("\ttab")
print("a row\nanother row")
#删除字符串的空白
string_with_space="    string with space    "
print(string_with_space.rstrip())   #删掉末尾的空白
print(string_with_space.lstrip())   #删掉开头的空白
print(string_with_space.strip())    #删掉两端的空白



#----------------------------------------#
#---------------number-------------------#
#----------------------------------------#
3**3    #3的三次方
0.2+0.2     #小数通常称为浮点数,由于计算机的处理方式,对小数的运算常常会出现不同的小数位数

age=23
#message="happy "+age+"rd birthday"     这个语句会报错,因为age的类型是数字,需要将其转换为字符串才能放在字符串中
message="happy "+str(age)+"rd birthday"
age='23'
age=int(age)    #将以字符串存储的数字转换为数字格式
if age%2==0:    #判断一个数字是否偶数
    print("Age is even")

#----------------------------------------#
#---------------list---------------------#
#----------------------------------------#
#定义列表
alist=['this',' is',' a',' list',23]
emptylist=[]
#访问列表
print(alist)    #这会输出包括方括号在内的内容
print(alist[0])     #这会输出alist的第一个元素this
print(alist[3].upper())     #对列表中类型为字符串的元素,可以使用字符串自带的方法
print(alist[-1])    #索引从0开始;-1表示最后一个元素,-2表示倒数第二个,以此类推
len(alist)      #返回列表的长度
#增删改列表
alist[0]='change'   #修改列表元素
alist.append('append')  #在列表末尾添加元素  #str添加元素的话用+=就行
alist.insert(0,'insert')    #在第0个位置插入元素,其后的元素都会后移一个位置
del alist[0]    #删除alist的第0个元素
popped_alist=alist.pop()        #方法pop会删除alist的最后一个元素,然后返回这个元素值;注意上面的append和insert都是没有返回值的
popped_alist2=alist.pop(1)      #pop也可以输出参数,删除和返回特定索引的值,不输入时,就默认是最后一个元素
alist.remove('append')      #如果只知道要删除的元素值而不知道索引时,可使用remove方法;remove只能删除第一个满足条件的值,如果要删除多个需要使用循环
#修改列表排序
alist.sort()        #将列表中的元素按照字母顺序排序,不允许列表中有数字
alist.sort(reverse=True)    #将列表元素按字母倒序排序
sorted_alist=sorted(alist)  #sorted函数返回排序后的列表,但不会改变原列表的排序
rsorted_alist=sorted(alist,reverse=True)
alist.reverse()     #直接按照相反的顺序排列
##列表for循环
for element in alist:   #每次循环都将alist中的一个元素赋值给element然后执行循环体,记得有冒号
    print(element)      #python通过缩进识别代码行之间的关系,因此一定要注意缩进 #记得在终端写for循环时,是需要自己打缩进的
##数值列表
#创建数字列表
numlist=list(range(1,5))    #生成的列表是1234,range函数不会包含第二个参数
numlist2=list(range(1,10,2))    #range的第三个参数是公差
#示例:创建一个数字列表,包含1:10的平方
squares=[]
for value in range(1,11):
    square=value**2
    squares.append(square)
#同一个例子的列表解析写法
squares=[value**2 for value in range(1,11)]
#描述性统计
min(numlist)
max(numlist)
sum(numlist)
#切片(访问列表的部分元素)
numlist[0:3]    #将返回numlist的第0、1、2个元素,第二个索引一般不会被返回
numlist[:3]     #省略起始索引,默认从第0个开始
numlist[1:]     #省略终止索引,默认到最后一个
numlist[-3:]    #返回最后三个元素
#复制列表
copylist=numlist[:]     #这会复制numlist的当前值到copylist
copylist2=numlist   #不使用方括号的话,copylist和numlist会联动,实际指向同一个列表
##元组dimension,即不可变的列表
dimensions=(2,3)    #元组使用圆括号
#dimensions[0]=30   #给元组中的元素赋值会报错
dimensions=(2,30)   #但是可以给元组重新赋值



##----------------------------------------#
##---------------if-----------------------#
##----------------------------------------#
#示例
for num in numlist:
    if num==1:      #一个等号是赋值,两个等号是判断
        num=num+1
    else:
        num=num+2
    if num!=1:      #!=不等于
        num=num-1
#条件判断中可以包含:< > <= >= 等数学符号
if num[1]==1 and num[2]==2:
    And=num[1]+num[2]
if num[1]==1 or num[2]==2:  #用括号增强可读性if (num[1]==1) or (num[2]==2)
    Or=num[1]-num[2]
'hello' in numlist  #in用来判断一个元素是否在列表中
'hello' not in numlist  #not in是否不再列表中
if num[1]==1:
    a=1
elif num[1]==2:
    a=2
else:       #可以只有if和elif,不一定要有else
    a=3
#检查列表是不是空的
emptylist=[]
if emptylist:   #当列表不是空的时返回True
    a=emptylist[0]


##----------------------------------------#
##---------------dictionary---------------#
##----------------------------------------#
dic={'color':'green','size':5}  #dictionary通过花括号定义,由key-value对组成
dic['color']    #通过key访问value
#字典的值可以是任意对象
dic['x']=1  #增加key-value对
#键值对的排列顺序没有意义
del dic['color']
#遍历键值对
for key,value in dic.items():   #方法items返回的是一个键值对列表
    print(key)
    print(value)
for key in dic.keys():  #等同于for key in dic:
    print(key)
for value in dic.values():  #去重:for value in set(dic.values())#set类似于string,但是其中的元素是去重的
    print(value)
#嵌套:把字典存储在列表中,或把列表存储在字典中
dic_1={'color':'green','size':5}
dic_2={'color':'green','size':5}
dic_3={'color':'green','size':5}
dics=[dic_1,dic_2,dic_3]
diclist={'color':'green','size':[2,3,4]}

##获取用户输入
message=input("Please input somthing: ")
print(message)




##----------------------------------------#
##---------------while--------------------#
##----------------------------------------#
a=1
while a<=5:
    print(str(a))
    a+=1
#可以用break退出循环
#可以用continue跳过某些情况的循环,在循环中的if...continue语句会检查是否满足if的条件,若满足则会跳过continue后面的所有语句开始下一个循环
#for循环不太适合修改列表或字典,如果需要修改,请使用while循环
alist=['a','b','c']
while alist:    #循环直到alist变成空列表
    a=alist.pop()


##----------------------------------------#
##---------------function-----------------#
##----------------------------------------#
#定义函数
a='var'
def func1(b):
#   """这是函数的文档字符串docstring"""
    print("this is what a function do with "+b)
#调用函数
func1(a)    #b是形参,a是实参
#位置实参:提供实参时,按照定义函数时的形参顺序
#关键字实参:不需要按照顺序,但是需要指定实参对应的形参,如exmfunc(vara='haha',varb='dddd')
#给形参提供默认值,在定义函数时输入:exmfunc(vara,varb='dog'),则后面调用时可以不用输入varb。有默认值的形参需要放在形参的末尾
#返回值
def exmfunc(vara,varb='dog'):
    output=vara+varb
    return ouput
    #return None    #返回空值
a=exmfunc('hello, ')
#通过类似func(alist[:])的形式向函数传递列表的副本,避免函数运行过程中更改原列表
#允许传递任意数量的实参
def exmfunc(*dims): #加上*后,函数会将输入的实参(不管是1个还是多个)都封装到一个叫做dims的元组(即不可修改的列表)中,这样在调用时,不管输入几个参数都可以
    for dim in dims:
        print("/n"+dim)
#def exmfunc(a,b,c,*dims)   #如果任意数量的形参不是唯一一个形参,那么需要将它放在形参的最后
#def exmfunc(a,b,c,**dics)  #调用exmfunc(a,b,c,d='d',e='e')   
#调用时可以输入多个键值对作为实参,这些键值对在函数体中会被当做一个dictionary


##----------------------------------------#
##---------------模块---------------------#
##----------------------------------------#
#将函数存储在模块中,需要时通过import调用。允许函数在不同程序中被调用,同时简化程序
#只需要将函数储存为py文件即可,导入后程序即可使用该文件中定义的所有函数
import modulefunc
modulefunc.func(vara,varb)#通过模块名.函数名来调用模块中的函数

from modulefunc import func1 as a, func2 as b
a(vara) #使用from...import的形式导入函数,则不需要在调用时指定模块名,不管是否指定了别名

from modulefunc import *
#import*表示导入模块中的所有函数,这种形式导入的函数也不需要在调用时指定模块名


##----------------------------------------#
##---------------类-----------------------#
##----------------------------------------#
#类可以用来定义一些对象的通用行为与特有属性。
class Dog():    #首字母大写的默认为类
    def __init__(self,name,age):
        #类中的函数称为方法,__init__是一个默认方法,每当从类中创建实例时都会自动调用
        #每个方法都需要self形参,指代创建的实例
        self.name=name  #将形参name的值赋给self的属性name(可以通过实例访问的变量称为属性)
        self.age=age
        self.health=10  #为health提供默认值,则不需要在init中有对应的形参
    def sit(self):
        print(self.name.title() + " is sitting.")
#在python2.7中,创建类时需要在括号中加入object:class Dog(object):

#创建实例
dog1=Dog('Wang',2)
#创建后,dog1变量就自动具备了name和age属性,以及sit方法
dog1.name
dog1.sit()

##修改属性的值
#1.直接修改
dog1.health=8

#2.使用方法修改
#在类中定义方法:
    def update(self,h):
        self.health=h
#调用方法进行修改:
dog1.update(8)
#方法2的好处是可以设定一些逻辑,如不允许新设定的值高于之前的值等,还可以直接在原来
    #的值的基础上增减,而不是直接赋一个新的值

##继承类
#继承一个类时,将会自动获得该类的所有属性和方法,并且与原先的类成为父类和子类的关系
class Doggy(Dog):   #父类必须在当前文件中
    def __init__(self,name,age):
        super().__init__(name,age)  #关联父类和子类,使子类拥有父类的所有属性
        #super(Doggy,self).__init__(name,age)   #在python2.7中需要两个实参
        self.color="white"  #定义子类特有的属性
        #继续在下方定义新的函数即可为子类新增方法,如果父类的某些方法不适用,可以在子类中定义一个同名的方法进行覆盖
        self.kind=Kind()    #类的属性和方法过多时,可以将其中一部分存储为另一个类,并在原先的类中创建此类的实例
#dog1.kind.func()   #类dog1的属性kind是一个类的实例,此行代码可访问kind实例中的func方法

##导入类
from module_name import calss_name1,class_name2,class_name3
import module_name  #导入整个模块
from module_name import *   #导入模块中的所有类(不推荐)

##python标准库
#python标准库是一组模块,默认安装在python中,其中的函数和类都可以使用。
#比如collections模块中的OrderedDict类,允许创建有序字典
from collections import OrderedDict
case = OrderedDict()
#pymotw.com可以了解python标准库

##----------------------------------------#
##---------------文件读写------------------#
##----------------------------------------#
##读取文件
with open('xxx.txt') as openfile:   #with表示当不需要访问文件时会将其关闭
#相对文件路径:'sub_folder\filename.txt'   #OS X和Linus系统使用斜杠/而不是反斜杠
#绝对文件路径:'C:\Users\folder\subfolder\filename.txt'
    a=openfile.read()   #read返回的字符串会多出一个空行
    line=[]
    for a in openfile:  #逐行访问openfile
        line.append(a)
    line=openfile.readlines()   #逐行读取openfile并存储在列表中
##写入文件
with open('xxx.txt','w') as fileobject: 
#加入参数'w'表示写入模式;r表示读取模式(默认),a表示附加模式,r+表示读写模式
    fileobject.write("write this in the file")
#只能写入字符串;可以用多条以上语句写入多行
#若使用的是附加模式,则源文件的内容不会被清空;写入模式和读写模式都会在返回文件对象前清空文件


##----------------------------------------#
##-----------------异常--------------------#
##----------------------------------------#
#当python运行过程中出现错误时,python会创建一个被称为异常的特殊对象,如果没有对这种异常
#进行特殊处理,程序就会终止并显示一个traceback
#使用try-except对异常进行处理:
try:
    print(5/0)
except ZeroDivisionError:
    print("Do not divide by zero! ")    #如果发现ZeroDivisionError则运行这行代码
    #pass   #如果不需要做出什么反应,可以在except代码块中使用pass语句
else:
    print("Successful") #如果未发现ZeroDivisionError则会运行这行代码
#其他异常:FileNotFoundError


##----------------------------------------#
##-----------------存储数据----------------#
##----------------------------------------#
#json(JavaScript Object Notation) 可以将信息存储在文件中,可以在python程序之间甚至其他语言的程序之间分享数据
import json
with open('xxx.json','w') as f:
    json.dump([2,3,4],f)    #json.dump将[2,3,4]写入到f代表的文件xxx.json中
    #写入json的文件扩展名一般为json
with open('xxx.json','r') as f:
    numbers=json.load(f)    #json.load将在f中的信息储存到numbers中


推荐阅读更多精彩内容