一、逻辑判断语句
1.1、第一个程序:用条件判断语句实现用户登录验证
ACCOUNT = 'zhangsan'
PASSWORD = '123456'
print('please inpute username')
"""
input()函数的作用就是让你输入自定义参数,比如用户名和密码
"""
user_account = input()
print('please inpute password')
user_password = input()
a = 1
b = 2
c = 3
if user_account == ACCOUNT and user_password == PASSWORD:
print('login success')
else:
print('login error')
print(a+b+c)
- input()函数的作用就是接受键盘输入的参数,然后将获取的用户密码信息与代码要求比较来达到用户登录校验的一个简单效果
- 测试结果:
1.2、for循环
1、普通for循环:序列
apple_list = [1,2,3,(11,12,13),5,"fda"]
for item in apple_list:
print(item,end = ' | ')
else:
print('======= test for 循环1运行结束 =======')
- 运行结果:
2、嵌套for循环
# 嵌套循环:序列、集合、字典
apple_list = [[11,12,13],('a','张三',2)]
for x in apple_list:
# print(x,end = " | ")
for y in x:
print(y,end = ' || ')
print("======= test for 循环2运行结束 =======")
- 运行结果:
3、测试break和continue:break是跳出当前循环、continue跳出当次循环
for x in apple_list:
# print(x,end = " | ")
for y in x:
if y == 13:
break
print(y,end = ' || ')
print("======= test for 循环3运行结束 =======")
- 测试结果:
4、获取0到10之间的偶数
-
递增获取:
for x in range(0,10,2): print(x,end = ' | ') print('======= test for 循环4运行结束,递增获取0到10之间的偶数 =======')
-
递减获取:
for x in range(10,0,-2): print(x,end = ' | ') print('======= test for 循环5运行结束,递减获取0到10之间的偶数 =======')
-
测试:
-
range()函数:range(i,j,a)标识获取所有从i到j的能整除a的值
5、获取有限长度的序列元素值
-
获取下标为偶数的序列值
for x in range(0,len(a),2): print(a[x],end = ' | ') print('======= test for 循环6运行结束=======')
-
获取指定长度的序列值
for x in range(0,4):
print(a[x],end = ' | ')
print('======= test for 循环7运行结束=======')
- 测试:
1.3、while条件语句
-
应用场景:递归
while a > 0: a -= 2 print(a,end = ' | ') print('while 循环执行完毕')
-
测试结果:
1.4、if条件语句
"""
a = input()
a = int(a)
if a == 1:
print('apple')
elif a == 2:
print('banana')
elif a == 3:
print('orange')
else:
print('shopping')
- 注意:python没有switch语句,常常使用if~elif的组合进行多条判断的代码实现。
1.5、使用字典实现switch
def get_yellow():
return 'yellow'
def get_red():
return 'red'
def get_green():
return 'green'
def get_defaul():
return 'defaul'
test = {0:get_yellow,
1:get_red,
2:get_green}
key = 5
# get(key,get_defaul)() get_defaul是指key的值没有匹配值的时候获取的默认值
print(test.get(key,get_defaul)())
- test.get(key,get_defaul)()中的get_defaul的意思就是指key的值没有匹配值的时候获取的默认值,可以看做是switch语句中的default代码块的逻辑。
二、Python的包、模块、类、函数的概念
- 包:只有含有__init__.py文件的文件夹才能叫做包
- 模块:一个.py文件就是一个模块
- 类: class 关键字声明定义的就是一个类
- 函数: def关键字声明的就是一个函数或者叫做方法,函数可以返回任意类型,可以返回一个或多个值,也可以不返回值。
- 依次层级:包(文件夹)> 模块(.py文件) > 类 > 属性、函数
2.1、包、模块、类的导入
-
场景:一个模块需要另外一个包、模块或者类的方法时,就需要导入操作;当导入一个包或该包下的模块时,会自动执行改包下面的__init__.py文件的内容,主要应用场景就是在__init__.py文件中初始化导入一些公共包。
-
假设我们要导入的是t文件夹下面的t1.py模块,模块内容如下:
#对应导入包、模块时*代表的所有属性值 __all__ = ["a","c"] a = 1 b = 2 c = 3
-
__all__对应导入包、模块时代表的所有属性值
1、导入包、模块的常见几种方式
-
直接导入目标模块:运行结果为1
import t.t1 print(t.t1.a)
-
将模块取别名导入,适用于导入路径过长的场景:结果也为1
import t.t1 as t1 print(t1.a)
-
通过from关键字的方式导入要获取的属性值:结果为1
from t.t1 import a print(a)
-
导入模块t.t1中的所有属性:变量、函数、类:结果为1
from t.t1 import *
print(a)
2、测试__init__.py文件初始化的作用
-
当导入一个包或该包下的模块时,会自动执行改包下面的__init__.py文件的内容,主要应用场景就是:在__init__.py文件中初始化导入一些公共包。
-
在t文件夹的__init__.py文件中写入如下的测试代码:
t = [1,2,3] print(t)
-
然后导入t或者t下面的模块比如t1.py文件:
import t import t.t1
-
测试结果如下:
-
init.py文件的简单应用,在t文件夹的__init__.py文件中加入如下的测试代码:
import sys import io
-
然后导入t模块并在我们自己的工程包下面引用sys和io的所有属性和方法以及类:
import t print(t.sys.path)
-
测试结果如下:
3、导入包、模块的原则
-
不可重复导入
-
不可循环导入,如果循环导入会造成类似于死锁的状态会报错
-
循环导入包:
1、t2.py文件:导入了t3.py文件import t3 t2 = 2
2、t3.py文件:导入了t4.py模块
import t4 t3 = 3
3、t4.py文件:导入了t2.py模块
import t2 t4 = 4 print(t2.t2)
-
测试结果:报错了,产生了死循环
2.2、python函数
1、简单函数定义:
def get_damage(a,b):
a *=2
b **=3
# 默认将多个返回数据拼成一个元组
return a,b
a,b = get_damage(2,3)
print(a,end = ' | ')
print(b)
- 测试结果:
- 总结:函数可以不返回任何参数或者返回一个或多个参数;当同时返回多个参数时,函数会将返回的结果封装成一个元组进行返回。
2、函数的必须参数和默认参数(关键字参数)
# sex = ‘男’是默认参数,可以不用调用
# name 属于必须参数,在函数调用的时候必须调用
def student(name,sex='男',age=15,school='新东方'):
print("我叫"+str(name))
print("我是"+str(sex)+"孩子")
print("我今年已经"+str(age)+"岁了")
print("我正在"+str(school)+"上学")
student("石敢当",'男',12,"朝阳一中")
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
student('团团')
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
student('小可爱','女',13)
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
# age = 24 属于关键字参数调用
student('钢铁侠',age=24)
- 测试结果:
- 总结:参数指明具体内容的如sex = ‘男’是默认参数也可以叫做关键字参数,可以不用调用,即选择性的调用;没有指明具体内容的参数叫做必须参数,如上述代码中的name参数就属于必须参数,必须参数在函数调用时必须调用并赋值。
2.3、Python类
1、定义一个简单的类:
class Student():
name = 'zhangsan'
age = 23
# self 相当于Java里面的this关键字,即指当前类
def print_file(self):
print("Student的姓名:" + str(self.name))
print("Student的年龄:" + str(self.age))
student = Student()
student.print_file()
print('===================================')
- 测试结果:
- 总结:每一个类都有一个self关键字,self 相当于Java里面的this关键字,即指当前类;如果在类的方法中我们要使用当前类的属性、方法等基本信息,我们需要在方法中将self关键字传参,这样我们才能使用当前类的所有属性信息。
2、类的四种基本函数(方法)
- 即构造函数、示例方法、类方法、静态方法
class User():
# 类变量
sum = 0
name = "mark"
age = 100
# 构造函数,存放的是实例变量
def __init__(self,name,age):
self.name = name
self.age = age
self.__class__.sum += 1
print('构造函数age:'+str(age))
# 实例方法
def play(self):
print("User的姓名:" + str(self.name))
print("User的年龄:" + str(self.age))
"""
类方法:
1、条件: @classmethod + cls 标注
2、作用对象:类,可由类名直接调用、也可由对象直接调用但实际上还是类在调用
3、应用场景:操作一些类变量
"""
@classmethod
def fire(cls):
cls.sum += 1
"""
静态方法:
1、条件 @staticmethod 标签声明
2、类名、对象引用都可以调用
"""
@staticmethod
def add(a,b):
print("执行了静态方法,结果为:" + str(a + b))
user1 = User('zhangsan',23)
user1.fire()
user2 = User('谷子地',23)
user2.fire()
User.fire()
User.fire()
user1.play()
# user.__dict__获取user对象的实例化详情信息
print(user1.__dict__)
print('===================================')
print(User.name + "| and |" + str(User.age))
print('===================================')
print('已创建:' + str(User.sum) + "个实例")
"""self详解:相当于Java里面的this
1、必须显示的出现在方法,函数里面;但是Java的this不需要
2、self指当前实例化的对象,不是类;只和对象有关
3、self也可以用this替代、所以self称之为关键字并不合适
"""
-
测试结果:
-
构造方法:所有类的构造函数都是__init__,构造函数的作用主要是初始化实例对象,一个实例对象对应一个构造函数,构造函数与类无关,构造函数必须传入self关键字参数。
-
示例方法:第一个例子就是示例方法,实例方法也必须传入self关键字参数。
-
类方法:主要作用是操作类,作用范围是类,具体要求如下
1、条件: @classmethod + cls传参 标注
2、作用对象:类,可由类名直接调用、也可由对象直接调用但实际上还是类在调用
3、应用场景:操作一些类变量 -
静态方法:作用范围也是类
1、条件 @staticmethod 标签声明,无需传入其它的关键字参数,如self和cls
2、类名、对象引用都可以调用;但是对象引用调用实际上就是类直接调用 -
self关键字详解:
1、必须显示的出现在方法,函数里面;但是Java的this不需要
2、self指当前实例化的对象,不是类;只和对象有关
3、self也可以用this替代、所以self称之为关键字并不合适 -
总结:仔细观察上述代码,我们可以得出这样一个结论;构造函数在实例化对象成功之前就已经执行了;类方法和静态方法只是作用于类,与对象实例无关;关键字__dict__是用于获取对象的实例化信息的字段;如上 name = “mark”,age = 100是类的变量设置的默认值,可以直接通过类名获取。
-
测试类与实例作用范围的不同:我们将构造函数的代码更改如下:
# 构造函数,存放的是实例变量 def __init__(self,name,age): self.name = name self.age = age self.sum += 1 print('构造函数age:'+str(age))
原先的代码
def __init__(self,name,age): self.name = name self.age = age self.__class__.sum += 1 print('构造函数age:'+str(age))
-
测试结果:原先的输出结果是6个实例,现在只有4个
-
为什么结果不同:因为__class__关键字就是声明该属性为类属性,操作的是类的sum属性,所以创建对象时类属性sum也进行了运算,但是如果不加上这个关键字,那么构造函数里面的sum属性就是实例对象的属性,当类方法中再次被调用时是拿不到实例方法中的这个sum值的,类属性sum的值并没有发生改变,仍然是0。
3、类的作用域
-
公有和私有作用域:
1、变量名、函数名前面双下划线代表这变量、函数为私有变量、函数;
2、去掉__或者跟init函数一样在变量名、函数名末尾加上__即可使其恢复为公有的
3、私有的变量名和函数均不可以通过对象实例访问class Teacher(): name = 'mark' work = '数学' __age = 23 # 构造函数 def __init__(self,name,work): self.name = name self.work = work # 类似于Java里面的set方法,给私有属性设置 def set__age(self,__age): self.__age = __age """ 测试私有变量是否可以调用并赋值 1、结果可以正确显示 2、原因:teacher1.__age相当于teacher1这个实例新建了一个名为__age的属性名,所以可以进行赋值操作 3、私有变量是不是一定不能获取:不是、可以通过下划线 + 类名 + 私有变量名获取 """ teacher1 = Teacher('张三','语文') teacher1.__age = 45 print(teacher1.__age) # 测试上述的变量是否与__age是一个相同的对象 print(teacher1.__dict__) print('访问私有的变量名:'+str(teacher1._Teacher__age)) # 测试set方法 teacher1.set__age(55) print('访问私有的变量名:'+str(teacher1._Teacher__age))
-
测试结果:
-
总结: 既然私有的变量不能访问,为什么上面的teacher1.__age又能正常打印,原因:teacher1.__age相当于teacher1这个实例新建了一个名为__age的属性名,所以可以进行赋值操作,但是这个是一个新的变量了与这个类原先的那个__age变量不是同一个变量,Java就不能这么干。所以Python是一门非常灵活的语言。
-
私有变量是不是一定不能获取:不是、可以通过下划线 + 类名 + 私有变量名获取;后面获取私有变量__age的值验证了上一条总结的正确性。
4、类的继承
-
类继承规范:
1、实现:就是在类名的括号里面加入要继承的类,一个类可以同时继承多个父类
2、父类的公有属性、函数均会被子类继承
3、子类和父类可以出现方法名相同的函数、调用子类对象时,优先执行子类的方法class Human(): name = 'zhangsan' age = '男' def __init__(self,name,age): self.name = name self.age = age def do_work(self): print('我是'+self.name+'准备开始工作了') def play(self): print('执行了父类的play方法') class Student(Human): school = '' def __init__(self,name,age,school): self.school = school # 注意self必须传递,否则失败 super(Student,self).__init__(name,age) def play(self): super(Student,self).play() print('执行了子类的play方法') # 测试是否继承了父类的属性和方法 student = Student('李四',55,'人民小学') print(student.name,end = ' | ') print(student.age) print(student.do_work()) print('+++++++++++++++++++++++++++++++++++') # 验证Human构造函数是否引用成功 print(student.school) # 测试相同的方法子类和父类谁先执行并测试super关键字是否起到了作用 student.play()
-
测试结果
5、枚举类
-
实现枚举的两个条件:
1、导入枚举类
2、自定义枚举类要继承Enum,这一点和Java不同 -
为什么选择枚举而不是类(字典):
1、枚举的元素值不可轻易改变,类和字典不行
2、枚举的元素值不可重复,类和字典可以重复from enum import Enum,unique class CarType(Enum): BEANTIAN_CAR = 1 BENCHI_CAR= 2 BAOSHIJIE_CAR = 3
-
获取枚举值:
print(CarType.BEANTIAN_CAR) print(CarType['BEANTIAN_CAR']) print(CarType.BEANTIAN_CAR.name) print(CarType.BEANTIAN_CAR.value) print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
CarType.BEANTIAN_CAR: 获取枚举元素全路径名
CarType[‘BEANTIAN_CAR’]:另外一种获取枚举元素全路径名的方式
CarType.BEANTIAN_CAR.name:获取枚举元素的参数名
CarType.BEANTIAN_CAR.value:获取枚举元素的具体值 -
打印结果:
-
遍历打印枚举
for car in CarType: print(car.name + ' | ' + str(car.value)) print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
-
打印结果:
-
设置枚举值只能为数字类型:int、float、布尔
1、导入IntEnum类
2、类要继承IntEnum枚举类
from enum import IntEnum
class ColorType(IntEnum):
yellow = 1.1
black = 2
orange = 3
blue = True
buffer = 4.9
for c in ColorType:
print(c.name,end = ' | ')
print(c.value)
print("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++")
- 打印结果:
- IntEnum枚举类使用总结:
1、如果枚举值为如1.1、4.9等小数,他会自动向下取整
2、boolean类型的底层数值其实就是1和0;1代表True,0代表False
3、当两个或多个枚举值相同时,第一个之后的枚举变量都是第一个枚举变量的别名:
如上述的yellow和blue,他们的值都是1,但是以yellow为准,只有yellow有意义会打印出来 - 设置枚举值唯一:
1、导入并继承相应的枚举类
2、引入unique适配器并用@unique标记枚举类@unique class Status(Enum): a = 1.1 b = 2 c = 3 d = 'fdasf' # 测试@unique for s in Status: print(s.name,end = ' | ') print(s.value)
- 打印结果:如果有两个或两个以上的枚举值相同,则会报错,因为unique的意思就是唯一的、不可重复的。