零基础学python(一)

1. 匿名函数

常规函数:

def fun(x, y):return x + y

匿名函数:

# lambda 空格后面是函数入参,冒号后面写函数体/函数逻辑
a = lambda x,y: x + y
print(a(2,3))

匿名函数/lambda函数的最大优点就是快速定义函数,使代码更精简。 

使用lambda函数求列表所有数的平方和:

a = [1, 2, 3, 4, 5]
result = list(map(lambda x: x ** 2, a))
print(result)from functools import reduce
result = reduce(lambda x, y: x + y, result, 0)
print(result)

上述过程中使用了map和reduce函数,类似于Java的流式操作,所不同的是Java中map和reduce是流对象的方法,而Python中map和reduce是内置函数,第二个参数是可迭代的集合。

还有filter操作:

a = [1, 2, 3, 4, 5]
result = list(filter(lambda x: x % 2 == 0, a))
print(result)

2. 变量作用域

根据变量作用域的划分,可以将变量分为全局变量和局部变量。对于整型全局变量,如果在函数中使用如下:

num1 = 10def func():num1 = 20print(num1)

此时打印仍是10,因为num1在函数中被认为是定义一个局部变量,跟第一行的全局变量没有关系,即在函数中修改全局变量num1未生效。如果想真正修改全局变量num1,需要引入global关键字:

num1 = 10def func():global num1num1 = 20print(num1)

但如果全局变量是列表,则可以在函数中修改成功,不用引入global变量,这是因为列表是可变数据类型的,而数字、字符串和元组是不可变的。 

3. random库

random库用来生成随机数

import random# 生成0-1之间的随机小数
print(random.random())# 生成1-100的随机整数,包括1和100
print(random.randint(1,100))

使用原始方法获取列表a中的随机一个数:

print(a[random.randint(0, len(a) - 1)])

使用random的api 获取列表a中的随机一个数:

print(random.choice(a)) # a可以为一个字符串

随机打乱一个列表:

print(random.shuffle(a)) # a可以为一个字符串

4. 正则表达式

import re
result = re.match("hello", "hello world!")
print(result)

结果表示匹配到了,是索引0-5的位置,匹配到的内容是hello

 \d 匹配单个数字:

result = re.match(r"\d", "123456")

 \d+匹配多个数字: 

result = re.match(r"\d+", "123456")

\w匹配字母数字以及下划线:

result = re.match(r"\w+", "a8*6")
print(result)

 \s匹配任意空白字符:

result = re.match(r"\s", "      ")

 $匹配结尾:

result = re.match(r"\s+$", "      ad")
print(result)

^匹配开头:

result = re.match(r"^\s+$", "      ")

.匹配任意字符:

result = re.match(r"^.+$", "waf-123")

[]表示可以匹配里面任意一个字符:

result = re.match(r"^[abcd]+$", "aaabbb")

[^] 表示可以不匹配里面任意一个字符

*表示匹配0个或多个,+表示匹配1个或多个:

result = re.match(r"^abcc+$", "abc")
print(result)

result = re.match(r"^abcc*$", "abc")
print(result)

{}表示精准匹配次数:

result = re.match(r"^abc{2,5}$", "abcccc")

|表示或:

result = re.match(r"^a|b|c$", "a")

5. 时间库

获取当前时间的时间戳

import time
t = time.time()
print(t)

获取结构化的时间,年份

t = time.localtime()
print(t)
print(t.tm_year)

将结构化时间转化为字符串

print(time.strftime("%Y %m %d %H:%M:%d", t))

6. socket库 

socke库可以实现服务端和客户端的通信。首先创建服务端:

import socket# 创建socket对象
sk = socket.socket()# 绑定ip(本机)和端口号
sk.bind(("0.0.0.0", 8999))# 设置监听,客户端个数为5个
sk.listen(5)# 等待客户端连接
conn, addr = sk.accept()print(conn)
print(addr)

然后创建客户端,使其连接服务端

import socket# 创建socket对象
sk = socket.socket()# 连接服务器
sk.connect(("127.0.0.1", 8999))

 客户端连接服务端后, 在服务端打印日志如下:

客户端发送数据:

import socket# 创建socket对象
sk = socket.socket()# 连接服务器
sk.connect(("127.0.0.1", 8999))while True:send_data = input("请输入你要发送的内容")sk.send(send_data.encode('utf8'))# 服务器响应的数据resp_data = sk.recv(1024)print(resp_data)

 服务器接收数据:

import socket# 创建socket对象
sk = socket.socket()# 绑定ip(本机)和端口号
sk.bind(("0.0.0.0", 8999))# 设置监听,客户端个数为5个
sk.listen(5)# 等待客户端连接
conn, addr = sk.accept()print(conn)
print(addr)While True:accept_data = conn.recv(1024)print("收到客户端的数据: " + accept_data.decode('utf8'))send_data = "收到"conn.send(send_data.encode('utf8'))

7. 实例属性、类属性、实例方法、类方法

实例属性通过self.的方式来创建赋值或更新,比如在初始化函数中操作实例属性:

class Player:def __init__(self, name, age):self.name = nameself.age = age

通过.__dict__可以查看实例的所有属性(字典的形式):

tom = Player("tom", 24)
print(tom.__dict__)

类属性是所有实例共有的,定义在类中:

class Player:# 类属性numbers = 0def __init__(self, name, age):self.name = nameself.age = agePlayer.numbers += 1

使用类属性需要使用类名.的方式:

print(Player.numbers)

实例方法是实例才能调用的方法,与普通的函数的区别在于:1. 在类中;2. 第一个参数是self;3. 调用时使用实例.的方式。

class Player:# 类属性numbers = 0def __init__(self, name, age):self.name = nameself.age = agePlayer.numbers += 1def show(self):print(self.name + " " + self.age)def show_attr(self):for k,v in self.__dict__.items():print(k,v)tom = Player("tom", 24)
tom.show()
tom.show_attr()

类方法是由@classmethod装饰器修饰的方法,第一个参数是cls,不通过实例来调用,通过类名.的方式来调用。

class Player:# 类属性numbers = 0def __init__(self, name, age):self.name = nameself.age = agePlayer.numbers += 1def show(self):print(self.name + " " + self.age)@classmethoddef show_numbers(cls):print(cls.numbers)        tom = Player("tom", 24)
Player.show_numbers()

8. 静态方法

静态方法由@staticmethod装饰器来修饰,表示这个方法跟类与实例都不想关,第一个参数既不是cls,也不是self。 调用静态方法也是通过类名.的方式。

class Player:# 类属性numbers = 0def __init__(self, name, age):self.name = nameself.age = agePlayer.numbers += 1def show(self):print(self.name + " " + self.age)@classmethoddef show_numbers(cls):print(cls.numbers) @staticmethoddef is_valid(**kwargs):pass       tom = Player("tom", 24)
Player.show_numbers()

9. 面向对象三大特性:继承、多态、封装

继承:子类继承父类,子类可以继承父类的属性,也可以有自己的一些独有属性,还可以调用或者覆写父类的方法。Python中继承父类使用"(Parent)"的方式:

class VIP(Player):def __init__(self, name, age, level):# 调用父类初始化函数super(name, age)self.level = leveltom = VIP("tom", 24)
print(type(tom))
print(isinstance(tom, Player))
print(isinstance(tom, VIP))

多态:同一个父类的不同子类,都拥有同名的方法,但是实现不一样,即多种形态。比如Python中的加号"+",对于整数进行加号运算,就是求和,但是对于字符串进行加号运算,就是拼接了。

class Animal:def speak(self):print("    ")class Cat(Animal):def speak(self):print("喵喵喵")class Dog(Animal):def speak(self):print("汪汪汪")def speak(obj: Animal):obj.speak()animal = Animal()
kitty = Cat()
puppy = Dog()speak(animal)
speak(kitty)
speak(puppy)

封装:一个类、一个函数都算是封装,使用者只需要知道函数和类的功能,而无需关注其内部实现细节。Python中没有严格私有属性的概念,如果希望一个属性是私有的,可以在属性前加1个下划线表示受保护不能随便使用(只是一个约定),但只是希望如此,并非真正能保护,因为还是可以通过实例.属性名的方式访问到,如果想要真正保护属性,可以加上两个下划线:

class User:def __init__(self, name, age):self._name = nameself.__age = agetom = User("tom", 24)
print(tom._name) # 能访问
print(tom.__age) # 不能访问

函数也是类似的,通过前面加上双下划线来保护。但是可以通过其它方式来访问实例的私有属性和调用私有方法(加上_类名):

print(tom._User__age) # 可以访问

使用dir内置函数查看对象的所有属性和方法(包括私有的):

print(dir(tom))

既然私有属性不能随便访问,需要提供get/set方法来获取/修改私有属性:

class User:def __init__(self, name, age):self._name = nameself.__age = agedef get_age(self):return self.__agedef set_age(self, age):self.__age = agetom = User("tom", 24)
tom.set_age(25)
print(tom.get_age())

使用装饰器@property和@setter来简化代码:

class User:def __init__(self, name, age):self._name = nameself.__age = age# 将函数变为变量,不能再当做方法来调用@propertydef age(self):return self.__age# 变量修改器@age.setterdef age(self, age):self.__age = agetom = User("tom", 24)
tom.age = 25
print(tom.age)

这样做似乎与直接将age变为公有变量是一样的,都是调用tom.age来获取或者修改属性值,但是这样的好处是在setter方法中可以做一些必要的校验,如果直接将age设为公有变量,修改值时是直接修改没法校验的。

10. 魔法方法

Python中的魔发方法是以两个下划线开头的,在进行某些特殊的操作(比如运算符操作、转化为字符串等等)时,会调用到这些魔法方法。比如上述类的初始化魔法方法,就是在创建对象完之后会自动调用的方法。如果想将对象转换为字符串,可以重写__str__方法:

def __str__(self):return self.name + ": " + self.age

在调用str(对象)时,就会调用上面的__str__方法。

如果想对实例进行加法运算,可以重写__add__方法:

def __add__(self, other):return self.name + other.name

如果想对实例进行是否相等的判断,可以重写__eq__方法:

def __eq__(self, other):return self.name == other.name

 

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

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

相关文章

【数据结构】(6.3)堆的应用——堆排序(C语言)

系列文章目录 文章目录 系列文章目录前言1. 堆排序的基础知识2. 堆排序详解2.1 堆排序整体思路2.2 思路详解2.2.1 建堆2.2.2 堆排序完整代码2.2.3 输出数据 3. 时间复杂度分析 前言 1. 堆排序的基础知识 堆排序(Heap Sort)就是对直接选择排序的一种改进…

04通俗理解自注意力机制(self-attention)

04浅谈自注意力机制(self-attention) 1. 基本概念 注意力机制 是Transformer模型的核心。它的作用是让模型能够“关注”输入数据的不同部分,而不是一次只处理一个词。比如,当模型在处理一句话时,它可以同时考虑句子中…

2024攻防演练:亚信安全新一代WAF,关键时刻守护先锋

实网攻防 网络安全如同一面坚固的盾牌,保护着我们的信息资产免受无孔不入的威胁。而其中,WAF就像网络安全的守门员,关键时刻挺身而出,为您的企业筑起一道坚实的防线。 攻防不对等 防守方实时应答压力山大 在攻防对抗中&#xf…

day04-matplotlib入门

matplotlib Matplotlib 提供了一个套面向绘图对象编程的 API接口 是一款用于数据可视化的 Python 软件包,支持跨平台运行 它能够根据 NumPyndarray 数组来绘制 2D(3D) 图像,它使用简单、代码清晰易懂,深受广大技术爱好 者喜爱。 实列&…

Django学习第五天

启动项目命令 python manage.py runserver 图像验证码生成随机字母或者数字 import random from PIL import Image, ImageDraw, ImageFont, ImageFilterdef check_code(width120, height40, char_length5, font_fileZixunHappyBold.ttf, font_size28):code []img Image.new…

Spring框架Mvc(2)

1.传递数组 代码示例 结果 2.集合参数存储并进行存储类似集合类 代码示例 postman进行测试 ,测试结果 3.用Json来对其进行数据的传递 (1)Json是一个经常使用的用来表示对象的字符串 (2)Json字符串在字符串和对象…

图文识别0难度上手~基于飞浆对pdf简易ocr并转txt

前言 本篇pdf适用windows对视觉识别0基础的的纯小白用户。大佬请绕道~~ 注意: 本项目pdf的ocr对于表格、画图文字,水印等干扰没做任何处理,因此希望各位使用该功能的pdf尽量不要含有这些干扰项,以免影响翻译效果。 流程 1.构建…

【c语言】轻松拿捏自定义类型

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C语言 目录 前言 一、结构体 1.结构体类型的定义和使用 1.1 结构体类型声明 1.2 结构体变量的创建和初始化 1.3 结构体变量成员的访问 1.4 结构体的特殊声…

三万字带你一遍跑通uer

三万字带你一遍跑通uer 参考文档 今天给大家介绍个非常强大的项目uer,集成了许多可以做自然语言的东西,效果的话也非常好,很适合企业级的应用! 1. 先将项目uer从github拉取下来(zip或git都ok) 2. 用pycha…

HTTP代理服务器:深度解析与应用

“随着互联网的飞速发展,HTTP代理服务器在网络通信中扮演着越来越重要的角色。它们作为客户端和服务器之间的中介,不仅优化了网络性能,还提供了强大的安全性和隐私保护功能。” 一、HTTP代理服务器的概念与作用 HTTP代理服务器是一种能够接…

价值499的从Emlog主题模板PandaPRO移植到wordpress的主题

Panda PRO 主题,一款精致wordpress博客主题,令人惊叹的昼夜双版设计,精心打磨的一处处细节,一切从心出发,从零开始,只为让您的站点拥有速度与优雅兼具的极致体验。 从Emlog主题模板PandaPRO移植到wordpres…

兴业小课堂|什么是法拍房助拍机构?如何挑选靠谱的助拍机构?

随着法拍房市场的不断发展和扩大 使法拍房数量的增加 其交易的复杂性和专业性需求也日益凸显 这促使了专门机构的出现来满足市场需求 法拍房助拍机构存在的原因主要有以下几点: 1.专业知识和经验: 法拍房的交易流程相对复杂,涉及到法律法…

【全网最全ABC三题完整版】2024年APMCM第十四届亚太地区大学生数学建模竞赛(中文赛项)完整思路解析+代码+论文

我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

第六节:如何解决@ComponentScan只能扫描当前包及子包(自学Spring boot 3.x的第一天)

大家好,我是网创有方,继上节咱们使用了Component和ComponentScan的方法实现了获取IOC容器中的Bean,但是存在一个问题,就是必须把AppConfig和要扫描的bean类放在同一个目录下,这样就导致了AppConfig类和bean类在同一个目…

6.8应用进程跨网络通信

《计算机网络》第7版,谢希仁 理解socket通信

成都仅需浏览器即可快速查看的数据采集监控平台!

LP-SCADA数据采集监控平台无需额外客户端,只需要一个标准的Web浏览器,用户可以迅速访问系统并开始使用,同时支持跨平台访问。一个用户可监控多个过程,多个用户可以监控同一过程,真正实现了数据的开放性及过程信号的透明…

CVPR2024自动驾驶轨迹预测方向的论文整理

2024年自动驾驶轨迹预测方向的论文汇总 1、Producing and Leveraging Online Map Uncertainty in Trajectory Prediction 论文地址:https://arxiv.org/pdf/2403.16439 提出针对在线地图不确定性带给轨迹预测的影响对应的解决方案。 在轨迹预测中,利用在…

【产品与技术双视角】初创团队利用小程序云基础设施“低成本试错”

文章目录 前言一、产品视角之三大困难二、技术视角之难以抉择三、利用小程序云基础设施“低成本试错” 前言 学生团队和初创团队在没有得到风投之前,想要做出一款产品太难了,难在哪呢?难在没有资源。用最狭隘的视角看这个资源:人…

SSM中小学生信息管理系统-计算机毕业设计源码02677

摘要 随着社会的发展和教育的进步,中小学生信息管理系统成为学校管理的重要工具。本论文旨在基于SSM框架,采用Java编程语言和MySQL数据库,设计和开发一套高效、可靠的中小学生信息管理系统。中小学生信息管理系统以学生为中心,通过…

hitcontraining_uaf

BUUCTF[PWN][堆] 题目:BUUCTF在线评测 (buuoj.cn) 程序del是没有将申请的指针清零,导致可以再次调用输出print。 查看add_note函数:根据当前 notelist 是否为空,来申请了一个8字节的空间将地址(指针)放在notelist[i]中&#xff…