零基础学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 = 10

def func():
    num1 = 20

print(num1)

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

num1 = 10

def func():
    global num1
    num1 = 20

print(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 = name
        self.age = age

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

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

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

class Player:
    # 类属性
    numbers = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Player.numbers += 1

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

print(Player.numbers)

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

class Player:
    # 类属性
    numbers = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Player.numbers += 1

    def 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 = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Player.numbers += 1

    def show(self):
        print(self.name + " " + self.age)
    
    @classmethod
    def show_numbers(cls):
        print(cls.numbers)        

tom = Player("tom", 24)
Player.show_numbers()

8. 静态方法

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

class Player:
    # 类属性
    numbers = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Player.numbers += 1

    def show(self):
        print(self.name + " " + self.age)
    
    @classmethod
    def show_numbers(cls):
        print(cls.numbers) 

    @staticmethod
    def 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 = level
        

tom = 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 = name
        self.__age = age
        
tom = 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 = name
        self.__age = age
        
    def get_age(self):
        return self.__age

    def set_age(self, age):
        self.__age = age

tom = User("tom", 24)
tom.set_age(25)
print(tom.get_age())

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

class User:
    def __init__(self, name, age):
        self._name = name
        self.__age = age
        
    # 将函数变为变量,不能再当做方法来调用
    @property
    def age(self):
        return self.__age

    # 变量修改器
    @age.setter
    def age(self, age):
        self.__age = age

tom = 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.mfbz.cn/a/775180.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第一百四十五节 Java数据类型教程 - Java字符串类型

Java数据类型教程 - Java字符串类型 零个或多个字符的序列称为字符串。 在Java程序中,字符串由java.lang.String类的对象表示。 String类是不可变的。 String对象的内容在创建后无法修改。 String类有两个伴随类,java.lang.StringBuilder和java.lang.…

欧科云链大咖对话:Web3原生创新静默期,科技巨头却在两极化发展

出品|OKG Research 作者|Hedy Bi 上周末,欧科云链研究院接受FT中文的邀请,作为圆桌嘉宾参与了由FT中文网与上海交通大学上海高级金融学院联合主办的金融大师课。在圆桌环节,笔者与各位教授和金融行业科技创新前沿实践…

基于aardio web.view2库和python playwright包的内嵌浏览器自动化操作

通过cdp协议可以实现playwright操控webview。 新建Python窗口工程 修改pip.aardio 修改pip.aardio,并执行,安装playwright。 //安装模块 import process.python.pip; //process.python.path "python.exe";/* 安装模块。 参数可以用一个字…

工地/矿区/电力/工厂/环卫视频智能安全监控反光衣AI检测算法的原理及场景应用

一、引言 随着科技的快速发展,特别是在智能交通和安全生产领域,对于夜间或弱光环境下的人员识别和安全监控需求日益凸显。反光衣作为一种重要的安全装备,被广泛应用于道路施工、工地作业、夜间巡逻、安全生产等场景,旨在提高人员的…

Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题

目录 Vue优化路径 一、使用key 二、使用冻结对象 三、使用函数式组件 四、使用计算属性 五、使用非实时绑定的表单项 六、保持对象引用稳定 6.1、保持对象引用稳定定义 6.2、保持对象引用稳定与不稳定的例子 6.3、vue2判断数据是否变化是通过hasChanged函数实现的 ①…

Spring AOP、Spring MVC工作原理、发展演变、常用注解

Spring AOP 概念 AOP全称为Aspect Oriented Programming,表示面向切面编程。切面指的是将那些与业务无关,但业务模块都需要使用的功能封装起来的技术。 AOP基本术语 **连接点(Joinpoint):**连接点就是被拦截到的程序执…

智能文档革新:合合信息智能文档处理平台上线基金合同抽取模型!

一、什么是基金合同? 基金合同是指具有平等地位主体的基金当事人在基金活动中,为规范其间的权利、义务,依意思表示一致而形成的契约或协议。《证券投资基金法》第五十二条规定,公开募集基金的基金合同应当包括下列内容: &#x…

软件游戏d3dcompiler_43.dll丢失怎么办,总结几种有效的方法

在使用电脑时,可能会碰到找不到d3dcompiler_43.dll的问题。即在使用过程中,突然弹出一个提示“d3dcompiler_43.dll丢失”,由于此文件的缺失,部分程序将无法启动。为恢复正常使用,我们需要修复此文件。接下来&#xff0…

【C++】 解决 C++ 语言报错:Undefined Reference

文章目录 引言 未定义引用(Undefined Reference)是 C 编程中常见的错误之一,通常在链接阶段出现。当编译器无法找到函数或变量的定义时,就会引发未定义引用错误。这种错误会阻止生成可执行文件,影响程序的正常构建。本…

Java项目:基于SSM框架实现的中小企业人力资源管理系统【ssm+B/S架构+源码+数据库+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的中小企业人力资源管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简…

matlab 绘制高等数学中的二维函数示例

matlab 绘制高等数学中的二维函数示例 绘制高等数学中的二维函数示例绘制结果 绘制高等数学中的二维函数示例 clc,clear,close all; % 定义方程 eqn (x, y) (x.^2 y.^2).^3 - y.^4;% 绘制方程曲线和坐标轴 ezplot(eqn, [-2, 2, -2, 2]) hold on % 在同一图形中保持绘图% 绘…

国际上备考所有云计算/IT证书的五大优质免费课程网站

最近越来越多的小伙伴来问小李哥,小李哥亚马逊云科技AWS认证大满贯是在哪里上课复习的呢?全部上付费课程那不是一笔巨款吗?小李哥这次来盘点备考国际上IT证书的5大优质免费课程网站(不只是亚马逊云科技AWS的课程,其他课程同样可以…

满足GMSL静电防护要求的方案

什么是GMSL?它是做什么用的?它有什么优点?设计GMSL防静电有啥难度? 带着这些疑问我们先了解下什么是GMSL。 一.简述 GMSL GMSL(Gigabit Multimedia Serial Link)即千兆多媒体串行链路&#xf…

odoo 物联网 设备数据采集方案

图一 架构手稿(许老师专属) 图二 架构简图 部署 方案一: odoo业务数据库与设备采集数据库使用一个instance。 缺点:重启pg服务相互影响。 方案二: odoo业务数据库与设备采集数据库独立部署,使用两个instance。 优点:…

一个使用率超高的大数据实验室是如何练成的?

厦门大学嘉庚学院“大数据应用实训中心”(以下简称“实训中心”)自2022年建成以来,已经成为支撑“大数据专业”复合型人才培养的重要支撑,目前实训中心在专业课程实验教学、项目实训、数据分析类双创比赛、毕业设计等方面都有深入…

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

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

vscode连接SSH——连接学校服务器,使用conda配置个人环境并使用

服务器的连接 在vscode远程资源管理中配置配置文件,如下图: 然后点击左下角进行连接: 点击需要连接的服务器,输入对应密码即可登录成功。 服务器上创建自己的环境 确保服务器上已安装anaconda。 先查看服务器上的conda信息&…

Linux_共享内存通信

目录 1、共享内存原理 2、申请共享内存 2.1 ftok 2.2 测试shmget、ftok 2.3 查看系统下的共享内存 3、关联共享内存 3.1 测试shmat 4、释放共享内存 4.1 测试shmctl 5、实现共享内存通信 6、共享内存的特性 结语 前言: 在Linux下,有一…

jenkins在使用pipeline时,为何没有方块形视图

项目场景: 安装完Jenkins时后,通过pipeline创建的项目任务。 问题描述 在立即构建后,没有显示每个阶段的视图。 原因分析: 原因是,刚安装的Jenkins,这个视图不是Jenkins自带的功能,而必须安装…

Cannot resolve symbol ‘log`

idea里的代码log变红色,是因为缺少Lombok插件。 安装lombok插件即可。安装完应用,重启软件就好了。 依次点击菜单栏中的 File → Settings(Windows/Linux) 或 IntelliJ IDEA → Preferences(macOS)。在设置…