Python高级

不定长参数

位置不定长参数,获取参数args会整合为一个元组

def info(*args):print('arg is', args)print('type(arg) is', type(args))info(1, 2, 3, 4, 'a', 'b')# 输出
# arg is (1, 2, 3, 4, 'a', 'b')
# type(arg) is <class 'tuple'>

关键字不定长参数,,获取参数kwargs会整合为一个字典

def info2(**kwargs):print('kwargs is', kwargs)print('type(kwargs) is', type(kwargs))for k, v in kwargs.items():print(k, v)print(kwargs['age'])# 测试数据
info2(name='Bob', age=20, sex='1')
# 输出
# kwargs is {'name': 'Bob', 'age': 20, 'sex': '1'}
# type(kwargs) is <class 'dict'>
# name Bob
# age 20
# sex 1
# 20

函数作为参数

def func(compute):print(type(compute))  # <class 'function'>result = compute(1, 2)return resultdef compute(x, y):return x + yprint(func(compute(1,2)))  # == func(3)
# 错误发生是因为您直接将compute(1, 2)的结果作为参数传递给func()函数,
# 而不是传递函数本身。当您调用compute(1, 2)时,它返回一个整数(x和y的和)
print(func(compute))

匿名函数

def定义的函数有名字,可以重复多次使用

但是lambda定义的函数只能使用一次

无法写多行

意会...

def func(compute):print(type(compute))  # <class 'function'>result = compute(1, 2)return result# def compute(x, y):
#     return x + yprint(func(lambda x, y: x + y))  # 3
print(func(lambda *args: sum(args)))  # 3

异常

try:a = 1 / 0print(a)
except:  # 捕获所有异常print('出错了1')
else:  # 没有出错执行这里print('没有出错')
finally:print('不管有没有出错,都会执行这里')try:a = 1 / 0print(a)
except NameError as e:print(e)print('出错了2')
except ZeroDivisionError as e:print(e)print('除数不能为0')
except Exception as e:  # 上面捕获到了,这里不再执行print(e)print('出错了e')

Python包

从物理上看,包就是一个文件夹,在该文件夹下包含了一个_init_.py文件,该文件夹可用于包含多个模块文件从逻辑上看,包的本质依然是模块

testpackage.__init__.py

print('testpackage package __init__')

testpackage.run.py

print('run')def fun1():print('fun1')

testpackage.py执行查看顺序

import testpackage.run
testpackage.run.fun1()# testpackage package __init__
# 这是run.py的print输出
# 这里是run.py的fun1函数

对象

构造

class Student:name = '默认'age = 999# self表示类对象本身,只有通过self才能访问到对象属性def __init__(self, namex, agex):print(f"初始化:{self.name}-{self.age} -> {namex}-{agex}")self.name = namexself.age = agexstu1 = Student('小明', 18)  
# 初始化:默认-999 -> 小明-18

内置方法

👾

__new__():创建并返回一个实例,这是在 __init__() 之前调用的。

__init__():初始化新创建的对象。

__del__():当对象即将被垃圾回收时调用,常用于资源清理。

__getattr__()__setattr__()__delattr__():控制属性的获取、设置和删除。

__call__():使对象可调用,像函数一样使用。

__str__(self)

__str__() 是 Python 中的一个特殊方法或者说魔术方法,主要用于定义类实例作为字符串表示的形式。当你试图打印一个对象或者将一个对象转换为字符串时,Python 会调用这个方法。

print(str(stu1))  # == print(stu1)
改造了__str__, 小明-18

__lt__(self, other)

__lt__() 是 Python 中的一个特殊方法,也称为魔术方法,用于比较两个对象的大小关系,具体来说是实现小于 (<) 操作符的功能。当一个对象实例 a 调用 a < b 时,如果 a 类型定义 __lt__() 方法,则该方法会被自动调用。

    def __lt__(self, other):return True if self.age < other.age else Falseprint(stu1 < stu2)  # True
print(stu1 > stu2)  # False

当执行 num1 < num2 时,Python 会自动调用 num1.__lt__(num2) 方法,根据其中的逻辑判断。如果需要与其他类型进行比较,一般还需要考虑类型检查以避免错误。

__eq__(self, other)

判断等于

为什么类定义函数要传入self

在Python中,子类定义函数(实际上是方法,即绑定到类实例的方法)时,需要传入self参数作为第一个参数,这是因为:

  1. 标识实例方法self参数标志着这是一个类的方法,而不是一个独立的函数。在面向对象编程(OOP)中,类的方法通常需要操作或访问类实例的状态(即实例变量)。self代表调用该方法的类实例本身,它让方法有了上下文,能够在方法内部访问和修改实例的属性。
  2. 隐式传递实例:当你通过类的实例调用一个方法时,Python会自动将实例作为第一个参数传给方法,这个参数在方法内部被称作self。例如,当你创建一个类Person并调用其say_hello方法时,实际上是这样运作的:
class Person:def say_hello(self):print(f"Hello, my name is {self.name}.")person = Person(name="Alice")
person.say_hello()  # 在内部,Python自动做了 person.say_hello(person)
  1. 一致性与可读性:在Python中,这是一种约定俗成的标准,有助于提高代码的可读性和一致性。所有类的方法都应该接受self作为第一个参数,以便开发者一看就知道这是一个类方法,并且能够方便地访问和操作实例的属性和方法。

总结起来,self参数的存在是为了让方法能够与类实例绑定在一起,并在方法内部访问和修改实例状态。虽然在技术层面上可以使用其他名称替代self,但由于这是Python编程社区广泛接受的约定,因此强烈建议始终使用self作为类方法的第一个参数。

封装

内部变量不让外面用

在Python中,尽管不像某些其他编程语言那样具有明确的private关键字,Python提供了约定俗成的方式来标记和实现私有成员变量(以及方法)。要声明一个私有变量,通常在变量名前加两个下划线(__)作为前缀,例如:

class Phone:__current_vlotage = Nonedef __keep_single_core(self):print('单核')xiaomi = Phone()
# xiaomi.__keep_single_core()
# AttributeError: 'Phone' object has no attribute '__keep_single_core'. Did you mean: '_Phone__keep_single_core'?
xiaomi._Phone__keep_single_core()  # 可以这么取,但不建议
# print(xiaomi.__current_vlotage)
print(xiaomi._Phone__current_vlotage)

这主要是为了防止子类无意间覆盖基类的内部实现细节,而不是为了完全禁止访问。 

继承

方式1:
调用父类成员
使用成员变量:父类名.成员变量
使用成员方法:父类名.成员方法(self)
方式2:
使用super()调用父类成员
使用成员变量:super().成员变量
使用成员方法:super().成员方法()

class Phone:IMEI = '123456789'producer = 'Apple'def call_by_4g(self):print('4G')class Camera:cmos = 'IMX989'producer = 'SONY'def take_photo(self):print('take photo')# 多继承子类
class iPhone5s(Phone, Camera):def call_by_4g(self):super().call_by_4g()def call_by_5g(self):print('5G')def take_photo(self):super().take_photo()p = iPhone5s()p.take_photo()
print(p.producer)  # 同名属性,先继承Phone的producer

多态

函数的形参是父类,其实可以传入子类

类型注解

🐮🐴,就是为了提示IDE这是什么类型数据,使其可以提示,就是一个标记,写错了不影响程序

ll: list[int] = [1,2,3,4,5,6]def fun(x:int, y:int)->int:return x+y# Union注解
from typing import Union
mylist: list[Union[str,int]] = [1,2,6,'cxk',7,'asshole',0]
mydict: dict[str,Union[str,int]]={"name":"cxk", "age":20}

操作数据库

MySQL :: Download MySQL Installer

基本框架

from pymysql import Connectionconn = Connection(host='localhost',port=3306,user='root',password='123456',autocommit=True)print(conn.get_server_info())  # 获取服务器信息8.0.36
cursor = conn.cursor()
conn.select_db('mysql')# cursor.execute('create table test_pymysql(id int);')
cursor.execute('select * from user')
# 取得查询结果,是一个元组
results: tuple = cursor.fetchall()
for result in results:print(result)conn.close()

闭包

如何避免某个变量被访问和随便修改

基础闭包,本质上就是返回内部的一个函数

def outer(logo):def inner(msg):print(f'<{logo}>{msg}</{logo}>')return innerfn1 = outer('Apple')
fn1('se3')
fn1('15 Pro')
# <Apple>se3</Apple>
# <Apple>15 Pro</Apple>fn2 = outer('Google')
fn2('Pixel X')
fn2('Pixel 5')
# <Google>Pixel X</Google>
# <Google>Pixel 5</Google>

 

def outer(num1):def inner(num2):# num1+=num2  # num1无法修改# cannot access local variable 'num1' # where it is not associated with a valuenonlocal num1  # 允许修改num1 += num2print(num1)return innerfn = outer(10)
fn(5)

优点:
无需定义全局变量即可实现通过函数,持续的访问、修改某个值
闭包使用的变量的所用于在函数内,难以被错误的调用修改

缺点:
由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放,一直占用内存

装饰器

装饰器其实也是一种闭包,其功能就是在不破坏目标函数原有的代码和功能的前提下,为目标函数增加新功能。

def outer(func):def inner(*args):print('sleep start')func(args[0])print('sleep end')return innerfn = outer(sleep)
fn(3)

设计模式

单例模式

创建类的实例后,就可以得到一个完整的、独立的类对象。

它们的内存地址是不相同的,即t1和t2是完全独立的两个对象。

某些场景下,我们需要一个类无论获取多少次类对象,都仅仅提供一个具体的实例用以节省创建类对象的开销和内存开销(比如微信只能开一个?)

🐎的,没下文了?就这么实现的?java都没这样啊

工厂模式

class Person:passclass Student(Person):pass
class Teacher(Person):pass
class Factory:def create_person(self, type):if type == 'student':return Student()elif type == 'teacher':return Teacher()else:return Nonefactory = Factory()
student = factory.create_person('student')
teacher = factory.create_person('teacher')
print(student)
print(teacher)

使用工厂类的get_person()方法去创建具体的类对象
优点:
大批量创建对象的时候有统一的入口,易于代码维护,当发生修改,仅修改工厂类的创建方法即可
符合现实世界的模式,即由工厂来制作产品(对象)(优雅)

没有线程万万不能

import threading
from time import sleep# threading_obj = threading.Thread(group=None,
#                                  target=None,
#                                  args=None,  元组传参
#                                  kwargs=None,字典传参
#                                  name=None,
#                                  daemon=None)def fun1():while True:print('|||||||||||||||||')sleep(1)def fun2():while True:print('—————————————————')sleep(1)def sing1(huabei):while True:print(huabei)sleep(1)def sing2(sihai):while True:print(sihai)sleep(1)if __name__ == '__main__':# th1 = threading.Thread(target=fun1)# th2 = threading.Thread(target=fun2)# th1.start()# th2.start()huabei = threading.Thread(target=sing1, args=('华北无浪漫',))sihai = threading.Thread(target=sing2, kwargs={'sihai': '死海扬起帆'})  # 🐮🐴这里的key设计一定要和形参一致?huabei.start()sihai.start()

网络编程

服务端

import socket# 创建socket对象
socket_server = socket.socket()# 绑定ip地址端口
socket_server.bind(('localhost', 8888))# 监听端口
socket_server.listen(1)  # 接受链接数量# 等待客户端链接
# result: tuple = socket_server.accept()
# conn = result[0]  # 客户端服务端链接对象
# address = result[1]  # 客户端地址信息
conn, address = socket_server.accept()  # 阻塞方法# 接受客户端消息
print('client', address, ': ')
while True:print(conn.recv(1024).decode('utf-8'))# 回复msg = input('回复:')if msg == 'exit':breakconn.send(msg.encode('utf-8'))# 关闭链接
conn.close()
socket_server.close()

客户端

import socket# 创建socket对象
socket_client = socket.socket()socket_client.connect(('localhost', 8888))while True:msg = input('发送:')if msg == 'exit':breaksocket_client.send(msg.encode('utf-8'))rec = socket_client.recv(1024)print('收到回复', rec.decode('utf-8'))socket_client.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯2023年第十四届省赛真题-棋盘

solution1(暴力) 暴力蓝桥杯可以过&#xff0c;虽然理论上会超时~ #include<iostream> using namespace std; const int maxn 2010; int a[maxn][maxn] {0};//0白棋&#xff0c;1黑棋 int main(){int n, m, x1, x2, y1, y2;scanf("%d%d", &n, &m)…

可视化大屏 附源码(Vue3 + TS + DataV + ECharts)

目录 前言 ✨项目代码 1、带有node_modules的项目包 &#x1f680; 2、不带有node_modules的项目包 &#x1f680; ⚒️项目屏幕大小调整 &#x1f48e; 使用开源项目 1、DataV &#x1f530; 2、Echarts &#x1f530; 3、PPchart &#x1f530; 4、表格平滑滚动 &a…

C# 如何修改项目名称

目录 背景具体步骤1、Visual Studio中修改项目名和程序集名称以及命名空间2、修改项目文件夹名3、修改解决方案里项目的路径4、再次打开解决方案&#xff0c;问题解决步骤总结 名词解释解决方案&#xff08;Solution&#xff09;项目&#xff08;Project&#xff09;程序集&…

sa-token非Web上下文无法获取Request

0x02 非Web上下文无法获取Request 问题定位 在我们使用sa-token安全框架的时候&#xff0c;有时候会提示&#xff1a;SaTokenException:非Web上下文无法获取Request 错误截图&#xff1a; 在官方网站中&#xff0c;查看常见问题排查&#xff1a; 非Web上下文无法获取Reques…

运行游戏找不到steam_api64.dll怎么办?steam_api64.dll丢失解决方法

steam_api64.dll是64位Windows操作系统上的一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;其大小通常在1.5-3.5 MB之间。这个文件对于Steam平台至关重要&#xff0c;因为它实现了游戏验证、更新等功能&#xff0c;并确保了用户拥有游戏的合法使用权。它通过提供一…

基于单片机水塔水位检测控制系统设计

**单片机设计介绍&#xff0c; 基于单片机水塔水位检测控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机水塔水位检测控制系统设计的主要目标是实现水塔水位的自动监测与控制&#xff0c;确保水塔内的水位始…

网页版五子棋对战实现和自动化测试

文章目录 前言一、项目描述项目演示链接 二、实现的功能与操作1.登录注册2.游戏大厅线程安全问题多开处理 3.五子棋对战 三、项目测试1.测试用例2.测试技术点3.部分测试用例展示&#xff08;1&#xff09;注册页面&#xff08;2&#xff09;登录页面&#xff08;3&#xff09;游…

生成式AI:最有商业前景的人工智能技术,不再是改变分发关系,而是升级生产力

根据最新的报告可以看出ChatGPT到底有多厉害&#xff0c;多个方面实现从判别决策到创造生成 生成式AI VS Web 3.0 &#xff1a;不追求生产关系的重塑&#xff0c;但将大幅度提升和创造生产力 创造是生成式AI的核心&#xff0c;本质是对生产力的大幅度提升和创造。生成式AI通过…

2、java语法之循环、数组与方法(找工作版)

写在前面&#xff1a;整个系列文章是自己学习慕课相关视频&#xff0c;进行的一个总结。文章只是为了记录学习课程的整个过程&#xff0c;方便以后查漏补缺&#xff0c;找到对应章节。 文章目录 一、Java循环结构1、while循环2、do-while循环3、for循环4、嵌套循环5、break语句…

【面试题】如何在级别用户中检查用户名是否存在?

前言 不知道大家有没有留意过&#xff0c;在使用一些app或者网站注册的时候&#xff0c;提示你用户名已经被占用了&#xff0c;比如我们熟知的《英雄联盟》有些人不知道取啥名字&#xff0c;干脆就叫“不知道取啥名”。 但是有这样困惑的可不止他一个&#xff0c;于是就出现了…

PaddleVideo:PP-TSM 视频分类

本文记录&#xff1a;使用Paddle框架训练TSM&#xff08;Temporal Shift Module&#xff09; 前提条件&#xff1a;已经安装Paddle和PadleVideo&#xff0c;具体可参考前一篇文章。 1-数据准备&#xff1a; 以UCF101为例&#xff1a;内含13320 个短视频&#xff0c;视频类别&…

2024年32款数据分析工具分五大类总览

数据分析工具在现代商业和科学中扮演着不可或缺的角色&#xff0c;为组织和个人提供了深入洞察和明智决策的能力。这些工具不仅能够处理大规模的数据集&#xff0c;还能通过强大的分析和可视化功能揭示隐藏在数据背后的模式和趋势。数据分析工具软件主要可以划分为以下五个类别…

YOLOv5标签值含义根据标签将检测框色块替换(马赛克)

以一个检测人脸的图片为例&#xff1a; 检测后生成的标签txt如下&#xff0c; 此时&#xff0c;如何根据标签值将检测到的人脸同色块替换呢&#xff1f; 关键是获取检测框的左上角坐标和右下角坐标。 img Image.open(D:/PythonWokspace/JINX/datasets_transform/dataset/im…

【鸿蒙开发】系统组件Text,Span

Text组件 Text显示一段文本 接口&#xff1a; Text(content?: string | Resource) 参数&#xff1a; 参数名 参数类型 必填 参数描述 content string | Resource 否 文本内容。包含子组件Span时不生效&#xff0c;显示Span内容&#xff0c;并且此时text组件的样式不…

图片管理系统:原理、设计与实践

title: 图片管理系统&#xff1a;原理、设计与实践 date: 2024/4/9 20:04:25 updated: 2024/4/9 20:04:25 tags: 图片管理存储组织上传采集处理编辑搜索检索展示分享AI应用 第一章&#xff1a;图片管理系统概述 1.1 图片管理系统简介 图片管理系统是一种用于存储、组织、处理…

跨地域分布的企业,SD-WAN帮助企业实现统一管理

全球化进程的加速&#xff0c;越来越多的企业在全球范围内展开业务&#xff0c;跨地域分布的企业网络管理面临着诸多挑战。SD-WAN作为一种新兴的网络技术&#xff0c;为跨地域分布的企业提供了一种有效的解决方案&#xff0c;帮助企业实现统一管理和集中控制。本文将探讨SD-WAN…

【负载均衡——一致性哈希算法】

1.一致性哈希是什么 一致性哈希算法就很好地解决了分布式系统在扩容或者缩容时&#xff0c;发生过多的数据迁移的问题。 一致哈希算法也用了取模运算&#xff0c;但与哈希算法不同的是&#xff0c;哈希算法是对节点的数量进行取模运算&#xff0c;而一致哈希算法是对 2^32 进…

摩尔信使MThings之数据网关:Modbus转MQTT

由于现场设备和物联网云平台采用了不同的通信协议&#xff0c;而为了实现它们之间的互操作性和数据交换&#xff0c;需要进行协议转换。 MQTT作为一种轻量级的、基于发布/订阅模式的通信协议&#xff0c;适用于连接分布式设备和传感器网络&#xff0c;而MODBUS协议则常用于工业…

Java之枚举详细总结

枚举是一种特殊类。 枚举类的格式&#xff1a; 修饰符 enum 枚举类名{名称1&#xff0c;名称2&#xff0c;...&#xff1b;其他成员 } 例如&#xff1a; public enum A {//枚举类中的第一行必须枚举对象的名字X,Y,Z; ​private String name; ​public String getName() {retu…

Linux初学(十七)防火墙

一、防火墙简介 1.1 防火墙的类别 安全产品 杀毒&#xff1a; 针对病毒&#xff0c;特征篡改系统中的文件杀毒软件针对处理病毒程序防火墙&#xff1a; 针对木马&#xff0c;特征系统窃取防火墙针对处理木马 防火墙分为两种 硬件防火墙软件防火墙 硬件防火墙 各个网络安全…