###############################################################################################
函数回顾
“”"
函数-功能
价值1:减少代码的重复
制作:
def 函数名称(): def全称define
函数体
使用
函数名称()
形式参数 函数本身定义
实参数 调用时 (位置参数,关键字实参,序列实参:使用*号拆分 ,字典实参:使用**号拆分字典)

函数参数
实际参数:与形参进行对应
1.位置实参:按位置顺序 格式:函数名(数据1,数据2,数据3)
2.关键字实参:按名称 格式:函数名(参数名2=数据2)
3.序列实参:拆 格式:函数名(*序列)
4.字典实参:拆
形式参数:约束实参
默认形参:实参可选
位置形参:实参必填
命名关键字形参:实参必须是关键字实参
不定长形参
星号元组形参:将实参合并为元组
是参数量无限

例:
def func02(p1,p2 =“”,*args,p3=0,**kwargs):
“”"
:param p1: 位置形参
:param p2: 位置形参+默认参数
:param args: 型号元组形参
:param p3: 命名关键字形参+默认形参
:param kwargs: 双星号字典形参
:return:
“”"
print(p1,p2=“”,*args)

“”"
#如果函数没有return ,相当于return None
#如果函数return 后面没有数据,也相当于return None


条件表达式
语法:变量 = 结果 1 if 条件 else 结果 2
例:

   def calculate_discount(account_type,money):if account_type =="vip"#if money<500:# return 0.85#else:#return 0.8return 0.85 if money <500 else 0.8  else:return 0.9 if money >800 else 1

函数返回容器
例 return return_1,return_2 /#返回是一个元组


作用域LEDB
Local 局部作用域 :函数内部有效
Enclosed外部嵌套作用域:函数嵌套
Global 全局作用域: 模块(.py文件)内部 整个文件有效
例:修改
a =100
def func01():
global a
a = 200 #修改全局
例:读取
list01 = [10]
def func02():
#读取全局变量
#修改列表第一个元素
list01[0] = 20

    Builtin 内置模块作用域: builtins.py文件

内容一 模块 包 异常处理
内容二 迭代 生成器
内容三 lambda 表达式 高级函数
内容四 闭包 装饰器

##########################################################################################

python_高级进阶

分析
界面可能使用控制台, 也可能使用web等等
识别对象: 界面视图类 逻辑控制类 数据模型类

基本的操作:增删改查

分配职责 :
界面视图类View: 负责界面逻辑,比如显示器,获取输入,显示输出结果等。
逻辑控制类Controller:负责存储学生信息,处理业务逻辑,比如添加,删除等。
数据模型类Model: 定义需要处理的数据类型。比如学生信息
例:
list01 = []
#增加
list01.append(10)
list01.append(20)

#修改
list01[0]=100

#查询
print(list01[0])

#删除
list01.remove(10)
del list01[0]


MVC 控制与显示分离
控制Controller :负责业务逻辑
显示View :负责界面逻辑
模型Model:封装数据
入口main:项目启动

案例

学生信息管理系统MVC

“”"
学生信息管理系统MVC
“”"

  1. 数据模型
class StudentModel:"""学生数据模型对具体学生信息进行抽象"""def __init__(self, name="", age=0, score=0, sid=0):self.name = nameself.age = ageself.score = score# 学生编号:对数据进行唯一标识(全球唯一标识符)self.sid = sid  # 自增长1001   1002   1003# 对某个数据进行有效性验证@propertydef score(self):return self.__score@score.setterdef score(self, value):if value < 0:value = 0elif value > 100:value = 100self.__score = value
  1. 界面逻辑
class StudentView:"""学生视图:负责处理界面逻辑"""def __init__(self):self.__controller = StudentController()def __display_menu(self):print("1) 添加学生信息")print("2) 显示学生信息")print("3) 删除学生信息")# ...def __select_menu(self):item = input("请输入选项:")if item == "1":# 先写调用,再快捷键生成定义函数代码# atl + 回车self.__input_student()elif item == "2":self.__show_students()elif item == "3":self.__delete_student()def main(self):"""入口函数"""while True:self.__display_menu()self.__select_menu()def __input_student(self):stu = StudentModel()stu.name = input("请输入学生姓名:")stu.age = int(input("请输入学生年龄:"))
**加粗样式**        stu.score = int(input("请输入学生成绩:"))self.__controller.add_student(stu)def __show_students(self):for stu in self.__controller.list_students:print(f"{stu.name}的编号是{stu.sid}年龄是{stu.age}成绩是{stu.score}")def __delete_student(self):sid = int(input("请输入需要删除的学生编号:"))if self.__controller.remove_student(sid):print("删除成功")else:print("删除失败")
  1. 业务逻辑
class StudentController:"""学生控制器负责处理业务逻辑"""def __init__(self):self.__list_students = []self.__start_sid = 1001# 只读属性@propertydef list_students(self):return self.__list_studentsdef add_student(self, stu):"""添加学生:param stu: 需要添加的学生对象"""stu.sid = self.__start_sidself.__start_sid += 1self.__list_students.append(stu)def remove_student(self, sid):"""删除学生:param sid: int类型的学生编号:return: bool类型,是否删除成功"""for student in self.__list_students:if student.sid == sid:self.__list_students.remove(student)return True  # 删除成功return False  # 删除失败

1.程序入口

view = StudentView()
view.main()

参照student_info_manager.py完成商品管理系统

  1. 实现添加商品信息功能
    View – 录入商品信息
    Controller – 添加商品信息
    画出内存图
  2. 实现显示所有商品信息功能
  3. 实现删除商品信息功能
class CommodityModel:def __init__(self, cid=0, name="", price=0.0):self.cid = cidself.name = nameself.price = priceclass CommodityView:def __init__(self):self.__controller = CommodityController()def __display_menu(self):print("1) 添加商品信息")print("2) 显示商品信息")print("3) 删除商品信息")def __select_menu(self):item = input("请输入选项:")if item == "1":self.__input_commodity()elif item == "2":self.__show_commodity()elif item == "3":self.__delete_commodity()def main(self):"""入口函数"""while True:self.__display_menu()self.__select_menu()def __input_commodity(self):commodity = CommodityModel()commodity.name = input("请输入商品名称:")commodity.price = float(input("请输入商品单价:"))self.__controller.add_commodity(commodity)def __show_commodity(self):for commodity in self.__controller.list_commoditys:print("%s商品编号是%d,单价是%.2f" % (commodity.name, commodity.cid, commodity.price))def __delete_commodity(self):cid = int(input("请输入商品编号:"))if self.__controller.remove_commodity(cid):print("删除成功")else:print("删除失败")class CommodityController:def __init__(self):self.__list_commoditys = []self.__start_cid = 1001@propertydef list_commoditys(self):return self.__list_commoditysdef add_commodity(self, commodity):commodity.cid = self.__start_cidself.__start_cid += 1self.__list_commoditys.append(commodity)def remove_commodity(self, cid):for commodity in self.__list_commoditys:if commodity.cid == cid:self.__list_commoditys.remove(commodity)return Truereturn Falseview = CommodityView()
view.main()

函数导入
导入方式1 :创建变量module01 关联该模块
#适合:面向过程的技术(全局变量、函数)
例 :
import module01
module01.func01

导入方式2:将该模块成员导入当前作用域中
语法 :from 文件名 import 内容
#适合:面向对象的技术(类)
例:

 # from  module01  import  func01
from module import MyClass
m01 = MyClass()
m01.func01()

导入方式3 : 将该模块所有成员导入到当前作用域中
语法 : from module01 import *


“”"
特殊导入方式
设置包的__init__.py 文件
“”"

导入包
方式1
设置

 import package01.package02.module01from package01.package02 as p p.module01.func01

方式二
from 包 import 包
设置

from package01.package02 import module01
from package01 import package02
package02.module01.func01

方式三
from 包 import *
设置 all = [“module01”]
from package01.package02 import *


**__all__变量 ** : 定义可导出成员,仅对from xx import
**__doc__变量 **:文档字符串
__file__变量 :模块对应的文件路径名、
__name__变量:模块自身名字,可以判断是否为主模块。

当前模块作为主模块(第一个运行的模块运行时),name__绑定__main,不是主模块

import demo01
print(demo01.__doc__)   **#获取文档字符串**
print(dem01.__file__)  **#获取文件完整路径**
print(demo01.__name__) **#获取模块名称**
print(__name__)   **#只有当前模块是主模块时,才是__main__**#如果当前模块是主模块,则执行入口代码
#(当前模块被导入,不执行入口代码)
if __name__ == "__main__"

import time

  1. 人类世界2021年2月1日
    世界元组: 年/月/日/时/分/秒/星期/一年的第几天/夏时令
    print(time.locatime())

  2. 计算机时间
    #时间戳:从1970年1月1日 0时0分0秒 到现在经过的秒数
    print(time.time()) #1612685177.7564297

3.时间戳 --> 时间元组

print(time.localtime(1612685177.7564297))  #time.struct_time(tm_year=2021, tm_mon=2, tm_mday=7, tm_hour=16, tm_min=6, tm_sec=17, tm_wday=6, tm_yday=38, tm_isdst=0)
  1. 时间元组 —>时间戳
tuple_time = time.localtime(1612685177.7564297)print(time.mktime(tuple_time))
  1. 时间元组 -->字符串
    #strptime #字符转为time
tuple_time = time.localtime(1612685177.7564297)print(time.strftime("%y/%m/%d %H:%M:%S",tuple_time))   #21/02/07 16:06:17     %Y 大写Y 为四位的年print(time.strftime("%Y/%m/%d %H:%M:%S",tuple_time))   #2021/02/07 16:06:17
  1. 字符串 -->变成时间元组
    例 #2021/02/07 16:06:17
tuple_time = time.localtime(1612685177.7564297)   #得到时间元组 time.strftime("%Y/%m/%d %H:%M:%S",tuple_time)  #转为字符串time.strptime("2021/02/07 16:06:17","%Y/%m/%d %H:%M:%S")   转为元组

异常处理

常见 : 名称异常NameError :变量未定义
类型异常TypeError :不同类型数据进行运算
索引异常IndexError :超出索引范围
属性异常AttributeError :对象没有对应名称的属性
键异常KeyError :没有对应名称的键
变量错误ValueError
为实现异常NotlmplementedError :尚未实现的方法
异常基类Exception ------->无论什么错误

报错:看最后一个链接

处理方法:
写法1 :对症下药
#检查可能出错的代码

 try :  代码逻辑except(ValueError,NameError ):  #错误执行 (官方建议)print("出错")

写法2:包治百病
#检查可能出错的代码
try :
代码逻辑
except: #错误执行
print(“出错”)

写法3 :
try :
代码逻辑
finally: #无论执行是否错误都执行
print(“出错”)

例:

   def get_score():
while True:try:score = float(input("请输入成绩:"))return score     #退出函数出口except:print("成绩输入有误,请重新输入")

异常处理实例

例 :

def get_score():while True:try:score = float(input("请输入成绩:"))return scoreexcept:print("成绩输入有误,请重新输入")if __name__ == '__main__':print(get_score())

带有 iter 是可迭代对象
带有 next 是迭代器

迭代iter :每一次对过程的重复称为一次"迭代",而每一次迭代得到
可迭代对象 -------- iterable

  1. 定义:具有__iter__函数的对象,可以返回迭代器对象

  2. 语法 iterable
    class 可迭代对象名称:
    def init(self,聚合对象):
    self.聚合对象 = 聚合对象

    def next(self):

: message = “我是迭代器”
iterable = message.iter()

# for 循环原理
1.获取迭代器对象
iterable = message.iter()

2.获取下一个元素

while True:try:item = iterator__next__()print(item)except StopIteration:break

3.如果没有元素,则停止循环,

例:

while True:try:item = iterator__next__()print(item)except StopIteration:break

面试题:可以参与for循环的条件是?
能够获取迭代器对象(可迭代对象)
具有__iter__函数

元组迭代
例 :

 tuple01   =(43,4,5,67,87,)iterator = tuple01.__iter__()while True:try:item = iterator.__next__()print(item)except StopIteration:break

字典迭代
例:

dict01 ={"a":"A","b":"B"}iterator  = dict01.__iter__()while True:try:key = itertor.__next__()value = dict01[key]print(key,value)except StopIteration:break

自定义迭代实例

 class SkillIterotor:def __init__(self,data):self.data = dataself.index = -1def __next__(self):self.index+=1if self.index < len(self.data):return self.data[self.index]else:raise StopIteration()                             class  SkillManger:def __init__(self):self.__skills = []def add_skill(self,skill):self.__skills.append(skill)def __iter__(self):return SkillIterator(self.__skills)manager = SkillManger()manager.add_skill("十八掌")manager.add_skill("六脉神剑")manager.add_skill("乾坤大挪移")#迭代自定义对象#for skill in manger:#print(skill)#模拟for循环iterator = manger.__iter__()while True:try:item = iterator.__next__()print(item)except StopIteration :break

自定义range 迭代器

"""自定MyRange类实现range(5)效果
"""class MyRangeIterator:# 迭代器def __init__(self,stop):self.number = -1self.stop = stopdef __next__(self):self.number += 1if self.number  < self.stop:return self.numberelse:raise StopIteration()class MyRange:def __init__(self, end):self.end = enddef __iter__(self):# 可迭代对象return MyRangeIterator(self.end)# for item in MyRange(5):  # 0~4
#     print(item)# 可以生成撑爆内存的数字
# 循环一次  计算一次  返回一次
for item in MyRange(9999999999999999999999999999999):print(item)for item in range(9999999999999999999999999999999):print(item)

yield 迭代返回值

例 :

  def  my_range(end):start = 0 while start <end;yield start start +=1 for item in my_range(5):print(item)

#延迟操作/惰性操作
#循环一次 计算一次 返回一次

“”"
返回列表中所有数字的个位
方式1:传统思想
定义函数,创建列表,循环计算每一个元素的个位,存入列表

方式2:生成器思想
定义函数,循环计算每个元素的个位,通过yield 返回
体会:惰性操作/延迟操作/推算数据

数据 list01 = [54,55,36,67,28,69,90]
“”"

方法1

def find_number_unit(list_target):list_result = []for number in list_target:unit = number % 10list_result.append(unit)return list_result list01 = [54,55,36,67,28,69,90]result = find_number_unit(list01)print(result)

方法2 #省内存 yieid 返回

def find_number_unit(list_target):for number in list_target:unit = number % 10yield unitlist01 = [54,55,36,67,28,69,90]result = find_number_unit(list01)  #调用不执行,延迟/惰性for item in result:print(item)

生成器

  class Generator:            # 生成器=  #可迭代对象 +迭代器def __iter__(self):     #可迭代对象return self def __next__(self):       #迭代器 ...                    def my_range(end):start = 0 while start <end:yieid startstart +=1

内置生成器

例 : list01 = [23,45,65,32,4,6,90]
修改奇数

方法1

  for i in range(len(list01)):if  list01[i] %2 :list01[i] =0

#(索引,元素)

方法2

 for i,element in enumerate(list01):if element %2:list01[i] = 0

dic01 ={"name":"bob","age":20,"sex":"male","grade":6}
for key,value in dic01.items():print(key,value)for i,value in enumerate(dic01.items()):   #方法1print(i,value[0],value[1])for i,(key,value) in enumerate(dic01.items()):  #方法2 print(i,key,value)

zip 实现矩阵转置

例1

 list01 = ["a","b","c","d"]list02 = ["A","B","C","D"]for item in zip(list01,list02):print(item)

例 2 :通过实现矩阵转置

     list02 = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]    # **方法 1**  (1,5,9,13) 代码已写死,多一个不行for item in zip(list[0],list[1],list[2],list[3])print(item)

#方法2 :使用*号 将列表元素拆开

for item in zip(*list01)  print(item)list02 = []for item in zip(*list01)list(item)  #变回列表 #或一步还原成列表  list02 = [list(item) for item in zip(*list01)]

“”"
生成器函数 —>给其他人用
生成器表达式 ----> 给自己用
“”"
数据 list01 = [64,4,True,“a”,False,“d”,5.4,“c”]
#列表推导式

list_result = [item for item in list01 if type(item) ==str]for item in list_result:print(item)

#生成器表达式

list_reslut = (item for item in list01 if type(item) ==str)

函数式编程

"""函数式编程
"""def  func01():print("func01")a = func01   #将函数赋值给变量
a()          #---->通过变量可以打印函数可以打印func01

价值: 通过参数调用函数,可以将逻辑注入到函数中
例 :

def func03(a):print("func03执行")  a()   func03(func01)

“”"
函数式编程 ----思想
面向对象
封装:分
继承:抽象 统一 隔离
多态
函数式编程
分:将通过和变化点分为多个函数
隔:使用参数隔离具体变化的函数
做:使用lambda定义变化函数
“”"

list01 = [45,655,34,4,24,5]
#需求:定义函数,获取所有大于10的数字
def find01()for item in list01:if item>10:yield item

#需求:定义函数,获取所有偶数

def find02()for item in list01:if item %2 ==0:yield itemfor number in find01()print(number.__dict__)
for number in find02()print(number.__dic__)

改:函数式编程

list01 = [45,655,34,4,24,5]
#提取变化函数

def condition01(item):return item>10def condition02(item):return item %2 ==0#提取通用函数def find(a):for item in list01:if a(item):yield item #变化+ 通用for item in find(condition01):pirnt(item)for item in find(condition02):pirnt(item)

类成员的静态方法

方法前面加 @staticmethod
定义 : @staticmethod
def 方法名称(参数列表)
方法体

2)调用:类名.方法名(参数列表)
不建议通过对象访问静态方法

说明
(1)使用@staticmethod修饰的目的是该方法不需要隐式参数
(2)静态方法不能访问实例成员和类成员

作用:定义常用的工具函数
例 :

class  IterableHelper:  @staticmethod   #不要自动传参def find(iterable,func)for item in iterable:if func(item)yield item

匿名函数

有名函数 用def 创建
无名函数用lambda
lambda 表达式不能赋值
lambda 函数体只能有一条语句

写法1
普通函数 :

def func01(p1,p2):return p1>p2print(func01(10,5))

匿名函数

 lambda p1,p2: p1>p2func02 = lambda p1,p2: p1>p2print(fun02(10,5))

得到: 效果一样

写法2 :有参数.无返回值

 def   func02(p1):print("参数是",p1)
func02(10)func02 = lambda p1: print("参数是",p1)func02(10)

写法3:无参数,有返回值

def  func03():return "result"
func03()func03 = lambda : "result"print(func03())

写法4:无参数,无返回值

def  func04():print "result"
func04()func03 = lambda : print "result"
func04()

####def 不能转换为lambda写法
例 1

def func05(p):p[0] =100list01 = [10]
func05(list01)
func05  = lambda p1:p1[0]=100  #报错

例2

def func06():for i in range(5):print(i)
fun06()
func06 = lambda

例3:

list01 = [45,655,34,4,24,5]#提取变化函数
def condition01(item):return item>10def condition02(item):return item %2 ==0#提取通用函数 ---无能查找
def find(a):                #创建钩子for item in list01:if a(item):       #拉起钩子(执行条件)yield item for item in find(condition01):         #向钩子上挂条件
print(item)
for item in find(condition02):         #向钩子上挂条件
print(item)

改为: lambda例子

list01 = [45,655,34,4,24,5]
#提取通用函数 ---无能查找
def find(a):                #创建钩子for item in list01:if a(item):       #拉起钩子(执行条件)yield item for item in find(lambda item : item %2 ==0):   #改为lambda 可以取消上面代码condition01)
print(item)
for item in find(lambda item :  item>10):   #改为lambda 可以取消上面代码condition01)
print(item)

python_advanced相关推荐

  1. python官网 中文版 新闻-新闻主页 - python兵者 - 博客园

    一.功能需求分析 1.banner 2.推荐文章列表 3.文章标签导航 4.文章列表 5.分页 二.模型设计 根据功能分析,我们需要如下表,大量的经验和功能积累 1.表和字段分析 a 文章分类表 b ...

  2. 12搜索功能实现+docker

    文章目录 docker 简介 基本概念 Image(镜像) Container (容器) Repository (仓库) 安装 docker 新闻搜索功能实现 需求分析 搜索引擎原理 elastics ...

  3. Django blog项目《四》:模板抽取

    文章目录 一.模板抽取分析 二.模板抽取 1. base.html挖坑 1. head挖坑 2. body挖坑 2. app应用templates填坑 1. users 2. news 3. docs ...

  4. 十六.静态页面抽取模板 2021-03-31

    十六.静态页面抽取模板 引言 模板标签之模板继承 静态模板文件:链接:https://pan.baidu.com/s/1eZKi4a5fBTmy-DwAQmr51w 提取码:8mmy django-- ...

最新文章

  1. Python LDA主题模型实战
  2. 十八、中断之独立按键
  3. C语言学习笔记(2)
  4. windows下apache建立不同虚拟主机
  5. 大数据之-Hadoop完全分布式_完全分布式配置总结---大数据之hadoop工作笔记0040
  6. 【算法】动态规划笔记
  7. Delphi入门教程
  8. VB获取一个文件夹中指定的文件或文件夹名称到列表
  9. Mac 复制 粘贴问题
  10. unable to find account data for the submitted AuthenticationToken
  11. 2022数学建模国赛A题赛后总结
  12. 淘宝电商项目落地,从零开始搭建亿级系统架构笔记
  13. win10蓝牙不能用
  14. DialogFragment设置不可取消
  15. 初识Matlab-简介|软件界面介绍|搜索路径|帮助系统
  16. 0xc0150002错误
  17. java二级考试试题题型有哪些_哪里有计算机二级题库?计算机二级考试题型有哪些?...
  18. JVM原理之完整的一次GC流程
  19. Centos7安装Mysql(yum 安装)
  20. 为什么 Java 仍将是未来的主流语言?

热门文章

  1. Prometheus 中 histogram_quantile 函数相关的若干问题
  2. python psutil.disk_Python psutil.disk_partitions方法代碼示例
  3. pip3 设置阿里云
  4. 伪类选择器和伪元素选择器详解
  5. android开发中像素单位介绍
  6. python常见笔试题整理
  7. 投资泰辑科技,七牛云积极布局物联网,构筑产业互联新生态
  8. java利用解释器模式实现简单计算
  9. 追赶法的matlab算法,[讨论]关于追赶法算法的执行速度
  10. severlet学习