python基础举例
最近又重新开始学python,浅浅记录下学习到的东西(也方便自己回顾看)
缩进、空格对于python很重要,一定要注意!
以下代码是基于pycharm编写的。
01 输出
#注释
# 单行注释用# ,ctrl+/是单行注释的快捷键
# 多行注销,全部选中,按住ctrl+/
# 多行注释,在python是用'''或"""(但不是很推荐)
#输入输出 %占位符,后面跟的是变量的类型
# print 函数自带换行效果
name="张阳"
classinfo="新世纪中学一年三班"
age=17
print("我的名字是%s:来自%s,今年%d"%(name,classinfo,age )) #%S表示字符型,%d表示整数型#基础输出语句
print("He said \"Let's go!\"") #\ means 转义符
print("He said \"Let\'s go!\"") #the same result as the 1st floor
print("Hello! \nHi!") #\n means 另起一行
print("hello!"+" hahaha") #两个字符组合在一起输出
#对字符串求长度
s = "Hello world!"
print(len(s))#通过索引获取单个字符,数组是从0开始计数的
print(s[0])# 布尔类型
b1=True
b2=False
#空值类型
n=None
#type 函数 输出数据类型
print(type(s))
print(type(b1))
print(type(n))
# 举例
#BMI计算
user_weight =float(input("请输入您的体重(单位:kg):")) #输入的是字符,所以需要转为float数
user_height =float(input("请输入您的身高(单位:m):"))
user_BMI=user_weight /(user_height ** 2)
print("您的BMI值为:"+str(user_BMI)) #需要转换成str字符类型,才可以输出
02 基础数值计算
import math
a=-1
b=-2
c=3
x1=(-b+math.sqrt( b**2 -4*a*c))/(2*a)
x2=(-b-math.sqrt( b**2 -4*a*c))/(2*a)
print(x1,x2)
#if-elif 的使用
#多分支,猜拳的小游戏
import random
person=int(input("请出拳:[0:石头,1:剪刀,2:布]"))
computer=random.randint(0,2) #在0到2之间取随机整数
if person>2 or person <0 :print("请输入正确的数字!")
elif (person==0 and computer ==1) or (person==1 and computer ==2) or (person==2 and computer ==0):win=1print("计算机输出为:%d" %computer )print("恭喜您,获胜!")
elif person==computer :win=0print("计算机输出为:%d" % computer)print("平局,再来一次吧!")
else :win=-1print("计算机输出为:%d" % computer)print("很遗憾,您输了!")
# 举例
#打印一个直角三角形
row=1
while row<=7:j=1while j<=row:print("*",end=" ") #这个end保证此print不换行,下面有个print()是为了有个换行j+=1print()row+=1#打印一个等腰三角形
height=int(input("请输入想要的等腰三角形的高:"))
standard=0
while standard< height:left=height-standardright=height+standardwhile left>=2:print(" ", end=" ")left-=1left = height - standardwhile left<=right :print("*",end=" ")left+=1print()standard+=1#for 循环,适合有限次的循环;适合遍历集合
tags="我是不是一个人"
for item in tags: #从tags中取值,遍历进行输出 tags是字符串类型,本身就是一个字符类型的集合print(item)
#range 此函数可以用来生成一个数据集合列表
range(起始,结束,步长) 步长不可为0,默认步长为1
for data in range(1,101): #起始数字,左边包含;结束数字,右边不包含print(data,end ="")if data % 10==0:print()
03 列表
# 在python, 序列就是一组按照顺序排列的值,即数据集合
# 有三种内置的序列类型:字符串、列表、元组
# 切片:可以根绝下标,获取序列对象的任意(部分)数据
name="peter"
print("姓名首字母变成大写%s"%name.capitalize() ) #首字母变大写# list: 列表,是一种有序的数据集合。
# 支持增删改查、数据项可以变化(内存地址不会改变)。
# 用[]表示列表,数据项之间用逗号来分割,数据项可以是任何类型的数据。支持索引和切片来进行操作shopping_list = [] #创建列表
shopping_list.append("键盘") #添加字符串
shopping_list.append("键帽")
shopping_list.remove("键帽") #移出
shopping_list.append("音响")
shopping_list.append("电竞椅")print(shopping_list)
print(len(shopping_list)) #输出长度
print(shopping_list[0]) #输出排在第一个位置的元素price =[799, 1024, 200, 800]
max_price = max(price)
min_price = min(price)
sorted_price = sorted(price) #排序
print(max_price,min_price )
print(sorted_price)
li=[1,2,3,"您好",8,9,10]
print(type(li))
print(len(li)) #获取字符串的长度
print(li[0]) #输出第一个元素
print(li[1:]) #获取从第二个元素开始到最后的元素
print(li[: : -1]) #-1表示倒序输出(从右往左输出)
print(li *2) #表示重复输出两次
li.append(["hello","goodbye"]) #末尾新加
li.insert(4,"这是我刚插入的数据") #在第四个位置后,进行信息插入
print("追加之后1",li)
rsDate=list(range(10)) #强制转换成为list对象
li.extend(rsDate ) #扩展,批量增加
print("追加之后2",li)
li[0]="peter" #对第一个元素进行修改
print("修改之后1",li)
del li[0] #删除列表中的第一个元素
print("修改之后2",li)
del li[1:3] #批量删除,删除第二到第三的所有数据
print("修改之后3",li)
li.remove(0) #移出为0的指定项,只能移除找到的第一个指定元素
print("修改之后4",li)
li.pop(5) #移出指定位置的香,比如这里移出第六个项
print("修改之后5",li)
print(li.index(8)) #查找8所在的位置
04 元组/字典简单使用
# 元组用(),不可变,添加删除不可使用
# 元组,是一种不可变的序列,在创建后不可做任何的修改。
# 用()来创建元组,数据项用逗号来分割,可以是任何的类型。
# 当元组中只有一个元素是,要加上逗号,不然解释器会当做整形来处理
tupleA =() #创建空元组
tupleA =("abcd",89,2.22,"marry",[11,22,33,44]) #对空元组进行赋值
print (tupleA)
#元组的查询
for item in tupleA : #依旧可以遍历print(item, end=" ")
print()
print(tupleA [2]) #可以通过索引获得单个元素
print(tupleA [:: -1]) #反转
print(tupleA [:: -2]) #隔两个,取一次反转
tupleA [4][0] =2223 #可以对元组中的列表元素进行修改,这里是对列表的第一个元素进行修改,但是元组中非列表的其他元素就不可以修改
print(tupleA )#一个字典,k可以进行查询
# 字典,由键值对组成的集合,通常使用键来访问数据,支持对数据的添加、修改、删除
# 不是序列类型,没有下标的概念,是一个无需的键值组合。用{}来表示字典对象,每个键值对用逗号分离
# 键,必须是不可以变的类型。值可以是任意的类型。每个键是唯一的,如果出现重复的键,后者会覆盖前面的
slang_dict = {"巨星年代":"来了吗","卷王时代":"啥时候过去?"} #创建了长度为2的词典
slang_dict["双减"] ="书本简单了,考试依旧难"
slang_dict["破防"] = "破了你的防御"
query=input("请输入你想要查询的流行语:")
if query in slang_dict : #判断查的词是否在字典中print("您查询的"+ query +"含义如下:")print(slang_dict [query])
else:print("当前本词典收录词条数为:"+ str(len(slang_dict ))+ "条。")# 字典再举例
dictA={} #创建一个空字典
dictA ["name"]="扬不养" #添加字典数据。key:name。value:扬不养
print(dictA )
dictA ["age"]=103
print(dictA )
dictB={"pro":"艺术","school":"家里蹲大学"} #也可以在新建字典的时候,之间添加字典数据
print(dictB )
print(len(dictB )) #以逗号分割为一项,故上面的dictB只有两项
print(dictA ["name"]) #取键值
dictA["name"]="王不枉" #修改键对应的值
print(dictA )
print(dictA .keys()) #打印 所有的键
print(dictA .values()) #打印所有的值
05 函数使用
#定义函数
def calculate_sector_1(central_angle, radius):#接下来是一些定义函数的代码sector_area =central_angle /360 *3.14* radius **2print(f"此扇形面积为:{sector_area}")calculate_sector_1(160,30)def calculate_bmi (weight, height):bmi=float(weight)/float(height) **2if bmi<=18.5:label="偏瘦"elif bmi <=25 :label = "正常"elif bmi<=30:label = "偏胖"else:label = "肥胖"print("您的BMI分类为:"+ label)print("您的BMI为:"+ str(bmi))return bmicalculate_bmi(70,1.8)
#函数使用练习2
#定义一个学生类
#能够设置学生某科目的成绩
#能够打印出该学生的所有科目成绩class Student:def __init__(self, name, student_id): #init这是固定格式self.name = nameself.student_id = student_idself.grades = {"语文": 0, "数学": 0, "英文": 0}def set_grade(self, course,grade): #self是固定,必须有的if course in self.grades:self.grades[course]=gradedef print_grades(self):print(f"学生{self.name}(学号: {self.student_id})的成绩为:")for course in self.grades:print(f"{course}: {self.grades[course]}分")chen = Student("小陈","100663")
zeng = Student ("小曾","100633")
print(chen.name)
zeng.set_grade("数学",95)
zeng.set_grade("语文",94)
zeng.set_grade("英文",93)
print(zeng.grades )
zeng.print_grades()
# 函数使用练习3:可变函数
# 可变参数:当参数个数不确定时使用,比较灵活
# 计算累加和
# 可变参数*接收的是元组类型,**接收的是字典类型
def getComputer(* args) :print(args)result=0length=int(len(args))while length>0 :result=result+args[length-1]length-=1"""另一种求和方式for item in args:result+=item"""print(result)getComputer(1,2,3,4,5)# 关键字可变参数,用**来定义
# 在函数体内,参数关键字是一个字典类型,key是一个字符串
def keyFunc(**kwargs) :print(kwargs )
dictC={"name":"Pipi","age":32}
# keyFunc(dictC) #这样是不可以的
keyFunc( **dictC) #这样是可以的
keyFunc(name="peter",age=22) # 这样是可以的,是以键值对的方式进行传递
# 函数练习使用4
# 写函数,接收n个数字,求这些参数数字的和;
def adder(*number):sum=0for item in number :sum+=itemreturn sum
print(adder(1,2,3,4,5,8))
# 写函数,找出传入列表或元组的奇数位对应的元素,并返回一个新的列表;
def process(con):listNew=[]index=1for i in con :if index %2 ==1: #判断奇数位listNew.append(i)index+=1return listNew
print(process([1,2,3,4,4,5,6,7,8,9,10,11]) )
# 写函数,检查传入字典的每一个value的长度,如果大于2,那么保留前两个长度的内容,并将新内容返回给调用者。PS:字典中的value只能是字符串或列表
def dictD (dictparms):result={}for key, value in dictparms .items(): #返回的是字典的数据项if int(len(value)) >2:result[key]=value[:2] #向字典去添加数据else:result[key]=valuereturn result
dictDD={"name":"bibi","age":"22","hobby":"baseball","saygoodbye":["no","hay","bye",5,6]}
# 注意上面的22需要加",因为不加就是int型,int不可以用len
print(dictD(dictDD ) )# 匿名函数,没有名字的函数,后面自带的表达式只有一个,只能实现简单的功能
# 语法结构: lambda 参数1、参数2、参数3:表达式
M=lambda x,y:x+y #通过变量去调用匿名函数
print(M(22,26))
06 类的使用
# 面向对象编程 OOP (object oriented programming)
# 面向过程,是按照解决问题的步骤开始写的
# 类:是一组具有相同或相似属性、特征、行为的一系列对象的集合
# 对象:类的实例化、具象化
#
class Person:name="小明" #类属性,表示直接归属于类的属性age=18def __init__(self,id): #实例属性,可理解为默认的初始值self.id="A111111"def eat(self): #实例方法,在类的内部,使用def关键字来定义,第一个参数默认是selfprint("大口大口吃饭")def run(self):print("一点也跑不动,不喜欢长跑")xm=Person (333) #创建一个对象,333指的是id
xm.eat() #调用函数
xm.run()
print("{}的年龄是:{}".format(xm.name,xm.age))class People:def eat(self):print("需要吃一日三餐")sam=People ()
sam.eat()
sam.age=22 #添加的是实例属性
sam.sex="male"# self和对象指向同一个内存地址,可以认为self就是对象的引用
class Human:def eat(self): #实例方法print(self)
xw=Human()
xw.eat()# 析构方法 相当于所有程序用一遍后,最后使用del()自动删除,释放内存空间
class Animal:def __init__(self,name ):self.name=nameprint("这是析构方法的初始化")def __del__(self): #主要的应用就是操作对象的释放,一旦释放完毕,对象便不能再使用print("这是析构方法")cat=Animal ("狸花")
# python中展现面向对象的三大特征:封装、继承、多态
# 封装:指的是把内容封装到某个地方,便于后面的使用。
# 继承:子可以继承父的内容。
class Animal2:def eat(self):print("can eat")def drink(self):print(" can drink")
class Dog(Animal2 ): #继承animal2的内容def sound(self):print("汪汪")
class Cat(Animal2 ):def sound(self):print("喵喵")
D1=Dog()
D1.drink()
C1=Cat()# 多继承,一个子类可以从多个父类进行继承
class monster(Dog, Cat):pass
m1=monster()
m1.sound()# 多态。多态必须发生在父类和子类之间,子类重写多态的方法
class Animal3: #父类def say_who(self):print("I am an animal.")
class Duck(Animal3 ):def say_who(self): #子类和父类这个名字相同时,才算是重写print("I am a duck.")pass
duck1=Duck()
duck1.say_who()
#类继承练习:人力系统
#员工分为两类,有相同属性,有不同属性
#子类优先调用自己的,自己没有时,才向父类调用class Employee:def __init__(self, name, id):self.name = nameself.id = iddef print_info(self):print(f"员工名字: {self.name}, 工号:{self.id}")class FullTimeEmployee(Employee):def __init__(self, name, id, monthly_salary):super().__init__(name, id) #用super表示的父类self.monthly_salary = monthly_salarydef calculate_monthly_pay(self):return self.monthly_salaryclass PartTimeEmployee(Employee):def __init__(self, name, id, daily_salary, work_days):super().__init__(name, id) #用super表示的父类self.daily_salary = daily_salaryself.work_days = work_daysdef calculate_monthly_pay(self):return self.daily_salary * self.work_dayszhangsan = FullTimeEmployee("张三","1111",8000)
lisi=PartTimeEmployee ("李四","1110",300,15)
zhangsan.print_info()
lisi.print_info()
print(zhangsan.calculate_monthly_pay())
print(lisi.calculate_monthly_pay() )
07 文件路径学习
#读文件
f=open("./read.txt","r",encoding= "utf-8") #./表示相对路径(常用于在同一路径下时),r表示只读,encoding表示编码方式
content=f.read()
print(content)
f.close() #关掉对文件的操作
#写文件
with open("./poem.txt","w",encoding="utf-8") as f1:f1.write("我欲乘风归去,\n") #没有换行符,这里就是不换行接着写f1.write("又恐琼楼玉宇,\n")f1.write("高处不胜寒。\n")
#在前面内容的基础上继续加话,但是如果还是用w模式则会将前面内容清空,所以采用a模式,即添加
with open("./poem.txt","a",encoding="utf-8") as f1:f1.write("起舞弄清影,\n")f1.write("何似在人间,")
08 异常捕捉
#try-except 是从上往下运行,如果前面的except已经捕捉到了错误,下面的就不会再执行了,类比if-else
try:user_weight =float(input("请输入您的体重(单位:kg):")) #输入的是字符,所以需要转为float数user_height =float(input("请输入您的身高(单位:m):"))user_BMI=user_weight /(user_height ** 2)
except ValueError: #如果输入一个非数字的字符,程序就会报错,也就是ValueErrorprint("输入不为合理数字,请重新运行程序,并输入正确的数字。")
except ZeroDivisionError : #即除零错误print("身高不能为零,请重新运行程序,并输入正确的数字。")
except: #可以捕捉发生的任意错误(常考虑于错误情况考虑不全时)print("发生了未知的错误,请重新运行程序")
else: #没有错误时,会运行print("您的BMI值为:" + str(user_BMI)) # 需要转换成str字符类型,才可以输出
finally: #无论错误与否,都会被执行print("程序结束运行。")