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.rhkb.cn/news/302846.html

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

相关文章

VRRP虚拟路由实验(思科)

一&#xff0c;技术简介 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种网络协议&#xff0c;用于实现路由器冗余&#xff0c;提高网络可靠性和容错能力。VRRP允许多台路由器共享一个虚拟IP地址&#xff0c;其中一台路由器被选为Master&#xff0c;负…

xshell使用

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 Xshell是用于连接和管…

Superset二次开发之图表标题动态化

需求:图表标题动态展示原生筛选器的值 非编辑状态 分析前端代码,找到元素对应的class=header-title 通过class查找对应的代码,核心就是这个title 路径:superset-frontend\src\dashboard\components\SliceHeader\index.tsx SliceHeader组件负责处理仪表板上某个切片(slice…

C++类与对象中(个人笔记)

类与对象中 类的6个默认成员函数1.构造函数1.1特性 2.析构函数2.1特性 3.拷贝构造函数3.1特性 4.赋值运算符重载4.1特性 5.日期类的实现6.const成员6.1const成员的几个问题 7.取地址及const取地址操作符重载 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为…

异常的种类

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 Oracle 运行时错误可以分为 Oracle 错误和用户自定义错误&#xff0c;与此对应&#xff0c;根据异常产生的机制和原理&#xff0c;可将 Oracle 的系统异常分为 3 种 预定义…

Linux使用宝塔面板安装MySQL结合内网穿透实现公网连接本地数据库

文章目录 推荐前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道 4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

ssm034学生请假系统+jsp

学生请假系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生请假系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处…

uniapp:Hbuilder没有检测到设备请插入设备或启动模拟器的问题解决

问题 使用模拟器调试运行项目时&#xff0c;出现以下提示&#xff0c;“没有检测到设备&#xff0c;请插入设备或启动模拟器后点击刷新再试”。排查了一天最终找到原因。 解决 已确认模拟器是已经正常启动&#xff0c;并且Hbuilder设置中的adb路径和端口都配置没有问题&#…

【Unity添加远程桌面】使用Unity账号远程控制N台电脑

设置地址&#xff1a; URDP终极远程桌面&#xff1b;功能强大&#xff0c;足以让开发人员、设计师、建筑师、工程师等等随时随地完成工作或协助别人https://cloud-desktop.u3dcloud.cn/在网站登录自己的Unity 账号上去 下载安装被控端安装 保持登录 3.代码添加当前主机 "…

UE5、CesiumForUnreal实现建筑白模生长动画效果

文章目录 1.实现目标2.实现过程2.1 实现原理2.2 具体代码2.3 应用测试3.参考资料1.实现目标 在上篇文章加载本地建筑轮廓GeoJson数据生成建筑白模的基础上,本文通过材质“顶点偏移”实现建筑白模生长效果,GIF动图如下所示: 2.实现过程 常用的实现建筑生长效果的方式有两种,…

HTML - 请你谈一谈img标签图片和background背景图片的区别

难度级别:中级及以上 提问概率:65% 面试官当然不会问如何使用img标签或者background来加载一张图片,这些知识点都很基础,相信只要从事前端开发一小段时间以后,就可以轻松搞定加载图片的问题。但很多人习惯用img标签,很多人习惯用backgro…

css字体相关属性

属性汇总 属性作用font-family 设置文章字体 font-size 设置字体大小 font-weight设置字体粗细font-style设置字体斜体font总体设置以上属性 设置文章字体 font-family属性 案例&#xff1a; 设置字体大小 font-size属性 注意事项&#xff1a; 1.必须要加单位&#xff0…

转圈游戏——快速幂

目录 题目 思路 代码 题目 思路 每个小朋友移动一次的位置为&#xff0c;移动 q 次的位置则为。那么题目要求移动 &#xff0c;最后的位置为 。 但 的范围是&#xff0c;而总的移动次数是 。时间复杂度是在&#xff0c;因此是一定不能硬算的&#xff0c;肯定会超时。那么该…

uniapp选择退出到指定页面

方法一&#xff1a;返回上n层页面 onUnload(){uni.navigateBack({delta:5,//返回上5层})},方法二&#xff1a;关闭当前页面&#xff0c;跳转到应用内的某个页面。 uni.redirectTo({url: "../home/index"//页面地址}) 方法三&#xff1a;关闭所有页面&#xff0c;打…

淘宝销量API商品详情页原数据APP接口测试㊣

淘宝/天猫获得淘宝app商品详情原数据 API 返回值说明 item_get_app-获得淘宝app商品详情原数据 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地…

机器学习-随机森林算法预测温度

文章目录 算法简介解决问题获取数据集探索性数据分析查看数据集字段信息查看数据集综合统计结果查看特征值随时间变化趋势 数据预处理处理缺失数据字符列编码数据集分割训练集、验证集、测试集数据集分割 构建模型并训练结果分析与评估进一步优化实际使用经验总结 算法简介 随…

【STL】顺序容器与容器适配器

文章目录 1顺序容器概述1.1array1.2forward_list1.3deque 2.如何确定使用哪种顺序容器呢&#xff1f;3.容器适配器的概念4.如何定义适配器呢&#xff1f; 1顺序容器概述 给出以下顺序容器表&#xff1a; 顺序容器类型作用vector可变大小的数组&#xff0c;支持快速访问&#…

蓝桥杯 H整数删除

蓝桥杯 H整数删除 尝试代码未果&#xff1a;希望有题感之后能按照这个思路AC #include<algorithm> #include<iostream> #include<cstring> #include<queue> #include<cmath>using namespace std;int n,k; int a[10010]; int h[2],e[10010],ne[1…

JavaScript - 你能说出解决跨域的一些方案吗

难度级别:中高级及以上 提问概率:65% 回答解决跨域之前,首先建议求职者描述什么是跨域。跨域问题是浏览器基于同源策略引起的,同源策略是浏览器的一种安全功能。同源要保证域名相同,或是被访问服务的协议+主机+端口都相同,那么反之这些属…

PostgreSQL入门到实战-第四弹

PostgreSQL入门到实战 PostgreSQL查询语句(一)官网地址PostgreSQL概述查询语句概述查询语句实操更新计划 PostgreSQL查询语句(一) 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.postgresql.org/PostgreSQL概述…