Python--总结第一阶段
核心1
"""Python核心1Python 简介执行过程源代码 -编译-> 字节码 -解释-> 机器码.py .pyc 01(只有导入的模块)|-----第一次-----|main.py -- 入口(代码简单,导入其他功能模块)usl.py -- 界面(处理界面逻辑View)bll.py -- 业务(业务逻辑Controller)model.py -- 模型(封装Model)快捷键:百度搜索Pycharm快捷Python自动化内存管理引用计数:每个对象记录被变量绑定(引用)的数量,当为0时被销毁。缺点:循环引用 - 两个垃圾数据互相引用时机:时刻标记清除:"全盘"扫描内存,检查(标记)不再使用的数据.缺点:效率太低时机:内存告急分代回收:将内存分为小中大三代每次创建新数据都在0代分配空间当标记清除后,将前一代有用的数据升级到下一代.前一代所有数据清空内存优化:尽少产生垃圾/自定义对象池/控制内存管理系统对象池:每当创建对象时,在池中判断是否存在相同对象,如果有直接返回地址如果没有再分配空间创建对象例如,字符串池/整数池/小数池.....价值:提高内存利用率"""
# 循环引用
list01 = []
list02 = []
list01.append(list02)
list02.append(list01)
del list01, list02# 产生垃圾的常用代码:
a = "数据1"
a = "数据2" # 当变量a又指向"数据2"时,"数据1"成为垃圾.b = "数据3"
del b # 因为变量b被销毁,所以"数据3"成为垃圾# 根据某些逻辑,循环拼接字符串.(频繁修改字符串)
str_result = ""
for number in range(10):# 两个不可变对象,相加后会产生新对象str_result = str_result + str(number)
print(str_result)# 解决:使用可变对象代替不可变对象
list_result = []
for number in range(10):list_result.append(str(number))
str_result = "".join(list_result)
print(str_result)data01 = "悟空"
data02 = "悟空"
print(id(data01))
print(id(data02))
核心2
"""Python核心2语句容器
"""# def func01():
# for r in range(5): # 执行一次
# for c in range(4): # 执行多次
# # continue # 跳过当次循环
# # break 跳出1层循环
# return # 结束函数(跳出所有循环)# 读取操作
import copy
list01 = [10, 20, 30]
list02 = list01 # 赋值:将list01存储的列表地址给list02
list03 = list01[:] # 浅拷贝:将list01指向的列表复制一份
list04 = list01[::-1] # 浅拷贝:通常,[30, 20, 10]list05 = [[10,20,30]
]
# list06 = copy.deepcopy(list05) # 深拷贝:拷贝所有数据[10,20,30]
list06 = list05[:] # 浅拷贝:只拷贝一层
list05[0][1] = 100 # 修改第二层数据
print(list06[0][1]) # ?# 写入操作
list01 = [10, 20, 30]
list01[0] = 100 # 将右侧数据地址赋值给列表元素
list01[1] = [200] # 将右侧数据地址赋值给列表元素
list01[2:] = [300,400] # 遍历右侧元素,赋值给列表元素
print(list01)
应用
# 斐波那契数列:从第3项开始,每一项都等于前两项之和。
# 1, 1, 2, 3, 5, 8, 13, 21..
# 定义函数,根据长度获取斐波那契数列。
def get_fib(length):#length = 6#保存数列前两项内容#[1,1] 1+1 = 2#[1,1,2] 1+2 = 3#[1,1,2,3] 2+3 = 5#[1,1,2,3,5] 3+5 = 8seq = [1, 1]if length <=2:return seqfor i in range(length-2):# i = 0 1 2 3# seq.append(seq[i]+seq[i+1])seq.append(seq[-1]+seq[-2])return seqprint(get_fib(10))# 2. 定义函数,删除列表中所有重复的元素(重复元素只保留一个)。
# 输入:[4,35,7,35,64,7,35]
# 输出:[4, 35, 7, 64]
def delete_duplist(target):for r in range(len(target)-1,0,-1):#r = range(5,-1,-1) 5 4 3 2 1 0for c in range(r):#r = 5 c = 0~4 0 1 2 3 4if target[c] == target[r]:del target[r]breakdef delete_duplist2(target):for r in range(len(target)-1,-1,-1):# target[0:r]切片 会产生新的列表 效率下降if target[r] in target[0:r]:del target[r]
# 16:02~16:12
list01 = [4,35,7,35,64,7,35]
delete_duplist2(list01)
print(list01)# 3. 定义函数,判断二维数字列表中是否存在某个数字
# 输入:二维列表、11
# 输出:True
def is_exists(double_list,target):for line in double_list:if target in line:return Truereturn Falsedouble_list = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]
]
print(is_exists(double_list,11))# 4. 定义函数,返回字符串中第一个不重复的字符。
# 输入:ABCACDBEFD
# 输出:E#统计字符串中 每一个字符出现的次数 以字典的形式返回
# {'A':2,'B':2...}
def get_repeating_info(target):dict_repeat_info = {}# 遍历字符串 取出每一个字符 获取数据(出现的次数) 保存到字典for char in target:# dict_repeat_info[char] = target.count(char)if char not in dict_repeat_info:dict_repeat_info[char] = 1else:dict_repeat_info[char] += 1print(dict_repeat_info)return dict_repeat_infodef firt_not_repeating_char(target):dict_info = get_repeating_info(target)for k,v in dict_info.items():if v == 1:return kprint(firt_not_repeating_char('ABCACDBEFDG'))# 5.质数:大于1的整数,除了1和它本身以外不能再被其他数字整除。
# 定义函数,获取指定范围内的所有质数。
# 输入:2,20
# 输出:[2, 3, 5, 7, 11, 13, 17, 19]#5 (234)
#8 (234567)
#n (2~n-1)
def is_prime(number):for i in range(2,number):if number % i == 0:#不是质数return Falsereturn True
# print(is_prime(5))def get_prime(begin,end):return [num for num in range(begin,end+1) if is_prime(num)]# result_list = []# for num in range(begin,end+1):# if is_prime(num):# result_list.append(num)# return result_list
print(get_prime(2,20))
核心3
"""Python核心3函数参数实际参数:对应位置实参:按顺序关键字实参:按名字形式参数:位置形参:必填默认形参:可选星号元组形参:合 - 位置实参命名关键字形参:约束只能是关键字实参双星号字典形参:合 - 关键字实参
"""# 位置形参:必填
def func01(p1, p2, p3):pass# 位置实参:按顺序对应
func01(1, 2, 3)
list01 = ["a", "b", "c"]
func01(*list01) # 拆# 关键字实参:按名称对应
func01(p1=1, p2=2, p3=3)
dict01 = {"p1": "a", "p2": "b", "p3": "c"}
func01(**dict01) # 拆# 默认形参:可选
def func02(p1=0, p2="", p3=0.0):passfunc02()
func02(1, "b")
func02(p2="b")
func02(1, p3=3.0)# 星号元组形参:合 - 位置实参
def func03(*args):print(args) # (1, 2, 3, 4, 5)func03(1, 2, 3, 4, 5)# 命名关键字形参:约束只能是关键字实参
def func04(*args, a, b):pass# sorted(__iterable,*,key,everse)
def func05(a, *, b=0):passfunc04(1, a=2, b=3)
# a属于主要必填数据,b属于特定环境下的修饰
func05(1, b=2)# 双星号字典形参:合 - 关键字实参
def func06(**kwargs):pass
面向对象实例
class Dog:count = 0def __init__(self,color):self.color = colorDog.count += 1#方法def say(self):print('wangwangwang')@classmethoddef total_count(cls):print(Dog.count)#实例化
# taidi = Dog('yellow&white')
#设置对象的属性
# taidi.color = 'yellow&white'
#设置对象的方法(行为)
# taidi.say = say
# erha = Dog('black&white')
# print(taidi.color)
# taidi.say()Dog.total_count()class MyWife:def __init__(self,name,age):self.name = nameself.age = age@propertydef age(self):return self.__age@age.setterdef age(self,value):if 20>value or value>30:raise ValueError('我不要')self.__age = valuewife1 = MyWife('翠花',20)
# 规范用户使用
# 20<age<30 休息20:00~20:10
wife2 = MyWife('小乔',2000)
# wife2.age = 2000class GParent:passclass Parent(GParent):def __init__(self,atk,hp):self.atk = atkself.hp = hpdef attack(self,target):passdef damage(self,value):pass#玩家攻击敌人 敌人受伤,还可能死亡class Player(Parent,GParent):def attack(self,target):print('黑虎掏心')target.damage(self.atk)def damage(self,value):print('小样你敢打我!')self.hp -= valueif self.hp <= 0:print('太菜了')class Enemy(Parent):def attack(self,target):print('普通攻击第一式')target.damage(self.atk)def damage(self,value):print('玩家打人啦')self.hp -= valueif self.hp <= 0:print('a~~~~')print('爆装备')p1 = Player(50,100)
e1 = Enemy(10,100)
p1.attack(e1)
e1.attack(p1)
e1.attack(p1)
e1.attack(p1)
e1.attack(p1)
p1.attack(e1)
#老张开车去东北
#坐飞机
class Person:def __init__(self,name):self.name = namedef go_to(self,vehicle,postion):print(self.name,'去',postion)#多态 调用父类方法vehicle.transport()#继承 隔离变化
class Vehicle:def transport(self):passclass Car(Vehicle):#多态 重写父类内容def transport(self):print('小汽车滴滴滴')class Airplane(Vehicle):def transport(self):print('飞机搜嗖嗖')# laozhang = Person('老张')
# c1 = Car()
# p1 = Airplane()
# laozhang.go_to(p1,'东北')
# laozhang.go_to(c1,'东北')#手雷爆炸 可能伤害玩家/敌人
class Grenade:def __init__(self,atk=50):self.atk = atkdef explode(self,target):target.damage(self.atk)class AttackTarget:def damage(self,value):pass
# 休息19:57~20:05
class Player(AttackTarget):def __init__(self,hp=100):self.hp = hpdef damage(self,value):self.hp -= valueprint('a~~~玩家受伤啦')class Enemy(AttackTarget):def __init__(self,hp=50):self.hp = hpdef damage(self,value):self.hp -= valueprint('敌人受伤啦')g1 = Grenade()
g1.explode(Player())
g1.explode(Enemy())#定义员工管理器 计算员工的薪资
#程序员 :底薪+项目分红
#测试: 底薪+bug数*5class EmpManager:def __init__(self):self.__all_emp = []def add_emp(self,emp):self.__all_emp.append(emp)def calc_total_salary(self):total_salary = 0for emp in self.__all_emp:total_salary += emp.get_salary()return total_salaryclass Employee:def get_salary(self):passclass Programmer(Employee):def __init__(self,base_salary,bonus=0):self.base_salary = base_salaryself.bonus = bonusdef get_salary(self):return self.base_salary+self.bonusclass Tester(Employee):def __init__(self, base_salary, bug_count=0):self.base_salary = base_salaryself.bug_count = bug_countdef get_salary(self):return self.base_salary + self.bug_count*5manager = EmpManager()
manager.add_emp(Programmer(20000,100000))
manager.add_emp(Tester(10000,200))
manager.calc_total_salary()
小游戏
# 1. 创建函数,生成指定行数的杨辉三角。
# 杨辉三角:
# 每行端点与结尾的数为1,每个数是它左上方和右上方的数的和
# 输入:6
# 输出:
# [
# [1],
# [1, 1],
# [1, 2, 1],
# [1, 3, 3, 1],
# [1, 4, 6, 4, 1],
# [1, 5, 10, 10, 5, 1]
# ]# 1 yanghui[2][0] yanghui[2][1]
# 3 yanghui[3][1]
# yanghui[3][0] yanghui[3][1]
# 4 yanghui[4][1]# yanghui[row-1][i-1]+yanghui[row-1][i]
# yanghui[row][i]
def get_yang_hui(row_count):#row_count = 6yanghui = []for row_index in range(row_count):#row_index 0~5row = [None] * (row_index+1)#设置每一行的内容#设置首尾row[0],row[-1] = 1,1#设置中间元素for i in range(1,row_index):row[i] = yanghui[row_index-1][i-1] + yanghui[row_index-1][i]yanghui.append(row)return yanghuiprint(get_yang_hui(6))# 2. "水仙花数":各位数字幂次方和等于该数本身
# 定义函数,根据位数计算水仙花数
# 输入:3
# 输出:[153, 370, 371, 407]
# 153 = 1**3+5**3+3**3
# '153'def check_num(num):'''判断数字num是不是水仙花数:param num: 数字:return: 布尔值'''str_number = str(num)#153 --> '153'power = len(str_number)# 3sum = 0for item in str_number:sum += int(item) ** power #sum = 1**3+5**3+3**3return sum == numdef get_list(n):'''获取指定位数的水仙花数列表:param n: 位数 整数:return: 列表'''# res = []# for i in range(10**(n-1),10**n):# if check_num(i):# res.append(i)return [num for num in range(10**(n-1),10**n) if check_num(num)]res = get_list(3)
print(res)# res = check_num(153)
# print(res)# 3. 二分查找
# 定义函数,在有序数字列表中找到目标值,并返回其索引。
# 如果目标值不在列表中,返回它可以按顺序插入的索引。
# 输入:[1,2,6,8,9] 8
# 输出:3
#
# 输入:[1,2,6,8,9] 5
# 输出:2def search_insert_index(num_list,target):left = 0right = len((num_list))-1while left <= right:mid = (left + right) // 2if num_list[mid] == target:print('找到%d' % target)return midelif num_list[mid] < target:left = mid + 1else:right = mid - 1print('未找到%d,可以在索引值%d位置插入' % (target,left))return leftsearch_insert_index([1,2,6,8,9],8)
search_insert_index([1,2,6,8,9],5)# 4. 根据值,对字典进行升序排列。
# 输入:{"张无忌":201,"赵敏":101,"小昭":105,"周芷若":302}
# 输出:[('赵敏', 101), ('小昭', 105), ('张无忌', 201), ('周芷若', 302)]def order_dict(dict_target):list_target = list(dict_target.items())print(list_target)for r in range(len(list_target)-1):for c in range(r,len(list_target)):if list_target[r][1] > list_target[c][1]:list_target[r],list_target[c] = list_target[c],list_target[r]return list_targetprint(order_dict({"张无忌":201,"赵敏":101,"小昭":105,"周芷若":302}))
计算员工工资
"""工资计算器
"""class SalaryCalculator:"""工资计算器"""# 免税收入free_income = 5000def __init__(self, list_salary_before_tax, special_deduction=0, base_pay=3613):"""创建工资计算器对象:param list_salary_before_tax:税前工资列表:param special_deduction:专项扣除:param base_pay:社保缴纳基数"""self.list_salary_before_tax = list_salary_before_taxself.special_deduction = special_deductionself.base_pay = base_pay# 社保是根据base_pay计算而来,不应由外部干预(配以只读属性)self.__social_insurance = 0self.__list_tax = Noneself.__list_salary_after_tax = Noneself.get_salary()@propertydef list_salary_before_tax(self):"""税前工资列表"""return self.__list_salary_before_tax@list_salary_before_tax.setterdef list_salary_before_tax(self, value):"""税前工资列表"""# 限制每月薪资都是正数for i in range(len(value)):if value[i] < 0:value[i] = 0self.__list_salary_before_tax = value@propertydef special_deduction(self):"""专项扣除"""return self.__special_deduction@special_deduction.setterdef special_deduction(self, value):"""专项扣除"""if value < 0: value = 0self.__special_deduction = value@propertydef base_pay(self):"""社保缴费基数"""return self.__base_pay@base_pay.setterdef base_pay(self, value):"""社保缴费基数"""if 3613 <= value <= 23565:self.__base_pay = valueelse:raise Exception("社保缴费基数超过国家限制范围")@propertydef social_insurance(self):"""个人社保缴纳费用"""return self.__social_insurance@propertydef list_tax(self):"""个税列表"""return self.__list_tax@propertydef list_salary_after_tax(self):"""税后工资列表"""return self.__list_salary_after_taxdef __calculate_personal_income_tax(self):"""计算个人所得税"""self.__list_tax = []for i in range(len(self.list_salary_before_tax)):month = i + 1salary_pay_tax = self.__get_salary_pay_tax(self.social_insurance, month)tax = self.__get_tax(salary_pay_tax)self.__list_tax.append(tax)def __get_salary_pay_tax(self, social_insurance, month):"""获取需要纳税工资:param social_insurance: 社保:param month: 月份:return:该月份需要纳税的工资"""# 纳税工资 = 累计税前工资 -累计起征点- 累计专项扣除数- 累计社保return sum(self.list_salary_before_tax[:month]) - SalaryCalculator.free_income * month - social_insurance * month - self.special_deduction * monthdef __get_tax(self, salary_pay_tax):"""获取当月个税:paramsalary_pay_tax: 获取需要纳税工资:paramlist_tax: 已缴纳税额列表:return:当月个税"""# 个税 = (累计纳税工资 * 预扣率 - 速算扣除数)-累计已缴纳税额deduction, tax_rate = self.__get_tax_rate_and_deduction(salary_pay_tax)tax = round(salary_pay_tax * tax_rate - deduction - sum(self.__list_tax), 2)if tax < 0: tax = 0return taxdef __get_tax_rate_and_deduction(self, salary_pay_tax):if salary_pay_tax < 36000:tax_rate = 0.03deduction = 0elif salary_pay_tax <= 144000:tax_rate = 0.1deduction = 2520elif salary_pay_tax <= 300000:tax_rate = 0.2deduction = 16920elif salary_pay_tax <= 420000:tax_rate = 0.25deduction = 31920elif salary_pay_tax <= 660000:tax_rate = 0.3deduction = 52920elif salary_pay_tax <= 960000:tax_rate = 0.35deduction = 85920else:tax_rate = 0.45deduction = 181920return deduction, tax_ratedef __calculate_salary_after_tax(self):"""计算税后工资"""self.__list_salary_after_tax = [round(self.__list_salary_before_tax[i] - self.__list_tax[i] - self.__social_insurance, 2)for i in range(len(self.__list_salary_before_tax))]def __calculate_social_insurance(self):"""获取社保"""# 养老保险:8%;医疗保险:2% 加三元;失业保险:0.2%;公积金:12%。self.__social_insurance = 3 + self.__base_pay * (0.08 + 0.002 + 0.02 + 0.12)def get_salary(self):"""获取工资:return:税后工资"""self.__calculate_social_insurance()self.__calculate_personal_income_tax()self.__calculate_salary_after_tax()return self.list_salary_after_tax# ----------------------------测试----------------------------
jh = SalaryCalculator([30000] * 12, special_deduction=1000, base_pay=20000)
ltt = SalaryCalculator([50000] * 12, special_deduction=1000, base_pay=20000)
print(jh.get_salary())
print(ltt.get_salary())
高级
"""python 高级装饰器 - 拦截导入模块/包方式:import 模块名 -- 本质就是通过变量(模块名)访问其他模块from 模块名 import 成员 -- 本质是将其他模块导到当前作用域中是否成功唯一标准:导入路径 + sys.path = 真实路径sys.path 是列表,存放所有导入搜索路径.根目录:主模块所在文件夹主模块:第一次运行的文件异常处理适用性:针对运行时的逻辑错误(数据范围),不是语法错误.现象:不断向上返回,不再向下执行.价值:保障程序可以按照既定流程处理语法:try:可能出错的代码except 错误类型:处理逻辑生成器惰性/延迟操作循环一次,计算一次,返回一个不建立容器存储所有数据生成器函数适用性:函数返回多个结果语法:def 函数名():...yield 数据for item in 函数名():print(item)生成器表达式语法:(item for item in 可迭代对象)"""
list01 = [4, 45, 5, 6, 7]
for item in list01:print(item)# iterator = list01.__iter__()
# while True:
# try:
# item = iterator.__next__()
# except StopIteration:
# break# 外函数负责接收旧功能
# 内函数负责包裹新旧功能
# 闭包:逻辑连续(从一次接收到多次包裹)
def verif_permissions(func):def wrapper(*args, **kwargs): # 合并insert(1,2, p3=3,p4=4)传入的信息print("验证权限")return func(*args, **kwargs) # 拆后与旧功能对应return wrapper@verif_permissions(10) # 一次接收
def insert(p1, p2, p3, p4):print(p1, p2, p3, p4)# 多次包裹
insert(1, 2, p3=3, p4=4) # 调用的是内部函数
insert(1, 2, p3=3, p4=4)
insert(1, 2, p3=3, p4=4)
Python--总结第一阶段相关推荐
- python开发基础戴歆第四章_第一阶段:Python开发基础 day04 课后练习
第一阶段:Python开发基础 day04 课后作业 1.简述python的五大数据类型的作用.定义方式.使用方法 数字类型 字符串类型 列表 字典 布尔型 答:数字类型分为整型(int)和浮点型(f ...
- Python第一阶段学习总结
[第7天]Python第一阶段学习总结 2021/09/23 一. 元组 元组的定义 元组是容器型数据(序列),将()作为容器的标志里面多个元素用逗号隔开:(元素1, 元素2,-) 元组不可变(不支持 ...
- 风火轮编程Python第一阶段课程检测评估单
风火轮编程Python第一阶段课程检测评估单 姓名: 一.单选题,把正确的答案编号写在问号后面. 1.python在英文中的本意是? ...
- Java学习总结第一阶段
day1(甘特图)预科阶段 甘特图:让工程项目变成可视化图表,也叫项目进度规划表. 一般由:任务名称.工期.开始时间.完成时间.前置任务.资源名称.日期组成 如下所示,资源名称那就是人的名字,前置任务 ...
- 【进阶Python】第一讲:开篇
前言 2015年,本科毕业的那个暑假我开始疯狂的投递简历,希望找一份数据分析与数据挖掘相关的实习工作.直到有一家公司的面试官问到我:"你会Python吗?",我当时一脸疑惑,因为, ...
- 大数据第一阶段学习笔记
开始:2022年11月6日 以下内容仅为个人笔记整理.(第一阶段的内容并不完全.硬件上有点问题,暂时无法解决,空着的部分后续补上.) 第0章 大数据介绍 大数据可以从事的职位有: 大数据工程师 数据分 ...
- 东师理想运维工具开发路线图(第一阶段)
东师理想运维工具开发路线图(第一阶段) 全面建设三个目标:自动化打包.自动化运维.自动化测试(由易到难) 1.TEACH.EDUOFFICE.备课助手.理想课堂 四个产品的内部IP+外部IP服务器端打 ...
- 专访北邮教授孙松林:5G尚处第一阶段 中国定会独领风骚
万物智联的5G时代即将到来,从2019年5月开始,网易科技重磅打造"5G+访谈",邀请行业内大咖共话5G,探讨"5G+"时代的机遇和挑战.网易科技将通过专业视角 ...
- C++第一阶段(远程控制)-卢嘉文-专题视频课程
C++第一阶段(远程控制)-203人已学习 课程介绍 C++这门编程语言40年屹立不倒,并在C++11标准推出后又迸发出新的活力,人们用到的操作系统,移动设备,嵌入式,分布式,Php, ...
- 视频教程-微信小程序开发教程(第一阶段、页面设计)(维吾尔语)-HTML5/CSS
微信小程序开发教程(第一阶段.页面设计)(维吾尔语) 毕业于北京邮电大学计算机专业.拥有将近10年的开发经验.精通java.php.python.c/c++.微信开发等等技术! 艾孜麦提阿布都热合曼 ...
最新文章
- 程序员的起床动力 | 每日趣闻
- mysql表只有frm文件_MYSQL数据文件--.frm文件(只有.frm文件时的表结构恢复)
- SQL Case When Then 条件判断
- 函数参数和函数返回值
- 数据库_7_SQL基本操作——表操作
- 使用mfc修改窗口背景,图表
- 数字信号处理基础知识
- 冰点还原忘记密码如何修改配置或卸载
- C语言异或运算逆运算,异或的逆运算
- 人力资源数据分析师前景_5-数据分析师前景怎么样
- Bazel5.0.0源码安装报错:no matching function for call to ‘StrFormat(const char [28], const char*)’
- 奔涌吧 后浪!!! 哔哩哔哩 何冰
- DER 和 PEM 格式
- 浏览器状态响应码详解 1XX/2XX/3XX/4XX/5XX
- 第二阶段>>>数据库/SQL/SSM/JDBC/核心总结
- PRI变换法原理解析及其matlab分析
- 企业信息化系统CRM篇
- 架构设计:系统间通信(10)——RPC的基本概念
- Web前端深色模式适配方案
- 电动车电池管理系统结构