Python语法基础篇(二)

  • 类型转换
  • 拷贝
  • 可变对象与不可变对象
    • 可变对象
    • 不可变对象
  • 函数
  • 拆包
  • 异常
  • 模块
  • 闭包
  • 装饰器

🐹🐹🐹🐹🐹一只正在努力学习计算机技术的小仓鼠,尾部有课程链接哦~🐹🐹🐹🐹🐹



类型转换

  • int():转换成整型
    print(int(1.8))
    
  • float():转换成浮点型
    print(float(5))
    
  • str():转换成字符串
    print(str(5.00))
    
  • eval():实现list、dict、tuple和string之间的转换 — 去引号,但是不安全(详见RCE)
    s = "[[1,2,3],[4,5,6]]"
    slist = eval(s)
    print(slist,type(slist))
    
  • list():将可迭代对象转换成列表  注:可迭代对象指能用for循环遍历的对象;支持转换为list的类型: string、tuple、dict、set
    # str -> list
    print(list('abc'))
    # tuple -> list
    print(list((1,2,3,4)))
    # dict -> list
    print(list({'name':'zhangsan', 'age':18}))
    # set -> list
    print(list({'a','b','c','d','e','f','g','h'}))
    

拷贝

  • 深拷贝:创建一个新对象,新对象涵盖所有层级的对象属性和数组元素,新对象与原对象不共用内存。
    import copy
    a = [1,2,3,[4,5,6]]
    acopy = copy.deepcopy(a)
    print(id(a),id(acopy))
    a[3].append(7)
    print(a,acopy)
    
  • 浅拷贝:创建一个新对象,只复制指针,该指针指向与原数据共同的对象。
    import copy
    a = [1,2,3,[4,5,6]]
    acopy = copy.copy(a)
    print(id(a),id(acopy))
    a[3].append(7)
    print(a,acopy)
    
  • 浅拷贝与深拷贝的区别详解

可变对象与不可变对象

可变对象

  • 概念:存储空间保存的数据允许被增加、删除或修改,但内存地址不会发生改变,这种数据就是可变类型。Python中可变对象有list、set、dict
    li = [1,2,3,4]
    print(li,id(li))
    li.append(5)
    print(li,id(li))
    

不可变对象

  • 概念:变量对应的值不能被修改,如果修改就会生成一个新的值从而分配新的内存空间。Python中不可变对象有tuple、int、float、string
    st = 'hello'
    print(id(st))
    st = 'bingbing'
    print(id(st))
    

函数

  • 概念:将独立的代码块组织成一个整体,使其具有特定功能。
  • 普通函数
    • 格式
      def 函数名():函数体return 返回值1, 返回值2 ...# 调用
      函数名()
      
    • 返回值类型
      • 没有返回值:None
      • 一个返回值:该值
      • 多个返回值:元组
    • 参数类型
      • 必备参数,默认参数  注:必备参数必须在默认参数前面。
        # x,y为必备参数;z为默认参数
        def my_add(x,y,z=10):return x+y+zp = my_add(1,2)
        q = my_add(1,2,3)
        print(p,q)
        
      • 可变参数:传入参数类型为元组,数量可以改变。
        def afunc(*args):tuple_to_list = list(args)print(args)print(tuple_to_list)
        afunc(1, 2, [3, 4])
        
      • 关键字参数:参数以字典的形式传值。
        def bfunc(**kwargs):for i in kwargs.keys():print(i, type(i))print(kwargs[i], type(kwargs[i]))
        bfunc(name='zhangsan',age=18)
        
    • 函数嵌套:在一个函数里定义另一个函数
      def cfunc():print('this is cfunc')def dfunc():print('this is dfunc')# 定义和调用同级(同缩进)dfunc()
      cfunc()
      
    • 作用域:按照变量生效范围可分为全局变量和局部变量
      • 全局变量
        a = 100
        def test1():print('a的值为%d' % a)
        test1()
        
        # 全局变量__name__
        # 作用:用于控制py文件在不同的应用场景执行不同的逻辑# 文件在当前程序执行:__name__ == '__main__'# 文件被当作模块导入时,不执行__name__ == '__main__'
        import pytest_1
        pytest_1.test()# pytest_1.py
        print('这是pytest2作为模块会显示的内容')
        def test():print('哈哈哈')
        if __name__ == '__main__':print('这是pytest2作为模块不会显示的内容')
        
      • 局部变量
        a = 120
        def test2():a = 100
        print('a的值为%d' % a)
        test2()
        print('a的值为%d' % a)
        
      • global 变量名:将变量声明为全局变量,用于修改全局变量值
        a = 120
        def test2():global aa = 100print('a的值为%d' % a)
        test2()
        print('a的值为%d' % a)
        
      • nonlocal 变量名:用于声明外层的局部变量
        def test3():a = 100def inner_func():nonlocal aa = 120print('a的值为%d' % a)inner_func()print('a的值为%d' % a)
        test3()
        
  • 匿名函数
    • 无参数
      funa = lambda : '一桶水果茶'
      fruit_tea = funa()
      print(fruit_tea)
      
    • 必要参数 函数名 = lambda 形参:返回值(表达式)
      add = lambda a,b:a+b    #a,b就是匿名函数的形参,a+b是返回值的表达式
      total = add(1,2)
      print(total)
      
    • 默认参数:默认参数必须写在必要参数后面
      funb = lambda name,age=18:(name,age)
      info_a = funb('张三')
      info_b = funb('李四', 20)
      print(info_a,'\n',info_b)
      
    • 可变参数
      func = lambda **kwargs:kwargs
      print([func(name='张三',age=18)])
      
    • lambda与if函数结合(三目运算符)
      fund = lambda a,b:a if a<b else b
      print(fund(1,2))
      
  • 内置函数
    • 查看所有内置函数:大写字母开头一般是内置常量名,小写字母开头一般是内置函数名
      import builtins
      print(dir(builtins))
      
    • abs():返回绝对值
    • sum():求和 — 元组,集合,数组
      print(sum([2,3]))
      
    • min():求最小值
    • max():求最大值
      print(min(-2,3, key=abs))
      
    • zip():将可迭代对象作为参数,将对象中的元素一一对应打包成元组(如果元素不一致,就按照长度最短的返回)
      l1 = [1,2,3]
      l2 = ['a','b']
      print(zip(l1,l2))
      for i in zip(l1,l2):print(i, type(i))
      # 转换成列表打印(条件:必须是可迭代对象)
      print(list(zip(l1,l2)))
      
    • map(function, iterable):对可迭代对象中的每一个元素进行映射。
      list1 = [1,2,3]
      def func(a,b=1):return a+b
      # 对象形式的数据有两种提取方式: (1)数组 (2)for循环
      print(list(map(func,list1)))
      print(list(map(lembda a,b=1:a+b, list1)))
      
    • reduce(function, sequence):将对象中的两个元素取出作为函数的实参进行运算,运算的结果和第三个元素作为函数的实参再进行运算。function:必须是有且仅有两个必要参数的函数sequence:必须是可迭代对象
      from functools import reduce
      list2 = [1,2,3]
      def add(x, y, z=1):return x+y+z 
      print(reduce(add, list2))
      
  • 递归函数
    • 概念:如果一个函数在内部不调用其他函数, 而是调用它本身, 这个函数就是递归函数。
      def acc(number):
      if number == 0:return 0
      else:return number + acc(number-1)
      print(acc(10))
      # 斐波那契数列
      def fabnacci(number):if number == 1 or number == 2:return 1else:return fabnacci(number-1) + fabnacci(number-2)
      for i in range(31):if i > 0:print(fabnacci(i), end=',')
      

拆包

  • 概念:对于函数中的多个返回数据,去掉元组、列表或字典,直接获取数据的过程
    tua = (1,2,3)
    print(tua,type(tua))
    # 拆解方法一
    a,b,c = tua
    print(a,b,c)
    # 拆解方法二
    a, *b = tua
    print(a, *b)
    # 一般在函数调用时使用
    def funa(a,b,*args):print(a,b)print(args,type(args))
    arg = [1,2,3,4,5,6]
    funa(*arg)
    

异常

  • 概念:当Python检测到一个错误时,解释器就无法继续执行下面的语句,反而会出现一些错误的提示。
  • 异常类型
    异常类型释义
    AttributeError尝试访问或设置一个对象不存在的属性或方法
    IOError输入/输出异常,例如无法打开文件
    ImportError无法引入模块和包,例如路径错误或名称错误
    IndentationError语法错误(的子类),例如代码没有正确对齐
    IndexError下标索引超出序列边界
    KeyError视图访问字典里不存在的键
    SyntaxError代码非法, 代码不能编译
    TypeError传入对象类型与要求的不符合
    ValueError传入一个调用者不期望的值
  • 异常处理:程序有异常时,整个程序仍能正常运行
    • 语法:
      try:可能引发异常现象的代码
      except:出现异常现象的处理代码
      else:只有在没有异常时才会执行的代码
      finally:try代码块结束后执行的代码
      
    • 示例:
      # 方法1:
      try:print(abc)
      except NameError as e:print(e)
      # 方法2 -- 捕获任何异常
      try:print(abc)
      except Exception as e:print(e)
      # 方法3 -- 多分支异常
      try:print(abc)
      except IndexError as e:print(e)
      except KeyError as e:print(e)
      except NameError as e:print(e)
      # else
      dic = {'name':'zhangsan'}
      try:print(dic['age'])
      except Exception as e:print('出现错误')
      else:print(dic)
      # finally
      try:print(dic['age'])
      except Exception as e:print(e)
      finally:print(dic)
      
  • 抛出异常 raise
    1. 创建一个Exception(‘xxx’)对象
    2. raise抛出这个异常对象
    # 需求:密码长度不足六位就重新输入,输入超过三次错误就报异常
    def login():for i in range(3):pwd = input('请输入密码:')if len(pwd) >= 6:return '密码输入成功'elif i != 2:print('密码长度不足六位,请重新输入')raise Exception('输入错误超过三次,退出')
    try:login()
    except Exception as e:print(e)
    

模块

  • 概念:一个py文件就是一个模块,即导入一个模块本质上就是执行一个py文件。
  • 分类
    1. 内置模块:random、time、os、logging
    2. 第三方模块:pip install 包名
    3. 自定义模块:自己在项目中定义的模块
    # 导入模块
    import numpy
    # 调用功能
    l1 = [1,2,3]
    l1 = numpy.append(l1,[4,5,6])
    print(l1)
    # 从模块中导入指定的部分
    from numpy import split
    # as起别名
    import pandas as pd
    
    • 概念:项目结构中的文件夹/目录。包的本质是模块,包可以包含包。
    • 作用:将有联系的模块放到同一个文件夹下,并且在该文件夹中创建一个__init__.py的文件。包能够有效避免模块名称的冲突问题,使结构更清晰。
    # import导入包时, 首先执行__init__.py文件
    # __all__ 本质是一个列表, 列表里面的元素代表要导入的模块。# Pack_01是Python Package
    from Pack_01 import *
    Register.reg()# __init__.py
    # 不建议在__init__.py中写过多代码, 尽量保证init的内容简单
    # 主要作用: 导入这个包内的其它模块
    # from Pack_01 import Register
    __all__ = ['Register']# Register.py
    def reg():print('这是reg函数')
    

闭包

  • 内部函数构成闭包的条件:
    1. 嵌套函数
    2. 内部函数使用外部函数的变量
    3. 外部函数返回内部函数
  • 无参数
    def funcA():a = 10def funcB():print(a)return funcB
    # 第一种调用方法
    print(funcA())
    funcA()()
    # 第二种调用方法
    ot = funcA()
    ot()
    
  • 默认参数
    # 函数名保存函数地址,()理解成指针
    def outer(m):n = 10def inner(p):print(m+n+p)return inner
    ot = outer(5)
    ot(5)
    
  • 思维训练
    def result(**kwargs):identity = {'code':0}identity['code'] = kwargs['add']def tup(*args):for i in args:identity['code'] += idef outer(a,b=1):identity['code'] += a+breturn kwargs.get('add')return outerreturn tup
    result(add=10)(1,2,3,4)(9)
    # 每次开启内函数都在使用同一份闭包变量
    print(result(add=10)(1,2,3,4)(9))
    

装饰器

  • 概念:装饰器本质上是一个闭包函数,它可以让其他函数不需要做任何变动的情况下增加额外功能,装饰器的返回值是一个函数对象。
  • 作用:在不改变原有代码情况下添加新的功能
  • 条件:
    1. 不修改源程序或函数的代码
    2. 不改变函数或程序的调用方法
  • 单个装饰器
    # 形参是函数
    def test(fn):print('test')fn()
    def HaHa():print('HaHa')
    test(HaHa)# 标准版装饰器
    def send():print('send message')
    def outer(fn):def inner():# 原有功能 --- send()fn()# 新功能print('check message info')return inner
    outer(send)()
    
  • 多个装饰器
    def deco_1(fn):def inner():return "哈哈哈"+fn()+"呵呵呵"return inner
    def deco_2(fn):def inner():return "nice"+fn()+"excellent"return inner
    # 多个装饰器的装饰过程,距离函数最近的装饰器先装饰。
    # deco_2 -> "nice"+test()+"excellent"
    # deco_1 -> "哈哈哈"+demo_2()+"呵呵呵"
    @deco_1
    @deco_2
    def test():return "晚上在学习python"
    print(test())
    
  • 语法糖
    • 格式:@装饰器名称
    • 无参数
      def outer(fn):def inner():fn()print('send message')return inner
      @outer
      def YYDS():print('YYDS')
      YYDS()
      
    • 有参数
      # 有参数
      user = [{'username':'zhangsan', 'password':'123456'}]
      def outer(fn):def inner(user):for i in range(len(user)):for j in user[i].keys():if j == 'username':print(f'用户:{user[i][j]}',end=',')else:print(f'密码:{user[i][j]}')fn(user)return inner
      @outer
      def login(user):while True:username = input('请输入用户名:')pwd = input('请输入至少六位密码:')if len(pwd) < 6:print('请重新输入')continueelse:user.append({'username':username, 'password':pwd})breakfor i in range(len(user)):for j in user[i].keys():if j == 'username':print(f'用户:{user[i][j]}', end=',')else:print(f'密码:{user[i][j]}')
      login(user)
      

课程链接

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

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

相关文章

录制mp4

目录 单线程保存mp4 多线程保存mp4 rtsp ffmpeg录制mp4 单线程保存mp4 import cv2 import imageiocv2.namedWindow(photo, 0) # 0窗口大小可以任意拖动&#xff0c;1自适应 cv2.resizeWindow(photo, 1280, 720) url "rtsp://admin:aa123456192.168.1.64/h264/ch1/main…

ISBN书号查询接口如何用PHP实现调用?

一、什么是ISBN书号查询接口 ISBN数据查询接口是一项图书信息查询服务。它基于全球通用的ISBN编码系统&#xff0c;帮助用户快速获取图书的详细信息&#xff0c;包括书名、作者、出版社、出版时间、价格、封面等关键字段。 该接口广泛应用于电商平台、图书馆管理系统、二手书…

Redis底层数据结构之深入理解跳表(2)

上一篇文章中我们详细讲述了跳表的增添、查找和修改的操作&#xff0c;这篇文章我们来讲解一下跳表在多线程并发时的安全问题。在Redis中&#xff0c;除了网络IO部分和大文件的后台复制涉及到多线程外&#xff0c;其余任务执行时全部都是单线程&#xff0c;这也就意味着在Redis…

Go语言依赖管理与版本控制-《Go语言实战指南》

在现代软件开发中&#xff0c;项目的第三方依赖和版本控制扮演着至关重要的角色。Go 语言自 Go 1.11 引入 Modules&#xff08;模块化管理&#xff09;以来&#xff0c;已经实现了内建的依赖管理机制&#xff0c;彻底摆脱了传统 GOPATH 模式的限制。 本章将深入探讨如何使用 Go…

Appium+python自动化(十一)- 元素定位- 下

1、 List定位 List顾名思义就是一个列表&#xff0c;在python里面也有list这一个说法&#xff0c;如果你不是很理解什么是list&#xff0c;这里暂且理解为一个数组或者说一个集合。首先一个list是一个集合&#xff0c;那么他的个数也就成了不确定性&#xff0c;所以这里需要用复…

stress 服务器压力测试的工具学习

一、stress 工具介绍 tress 是一种工具&#xff0c;可以对符合 POSIX 标准的操作系统施加可配置数量的 CPU、内存、I/O 或磁盘压力&#xff0c;并报告其检测到的任何错误。 stress 不是一个基准测试。它是由系统管理员用来评估其系统扩展性的工具&#xff0c;由内核程序员用来…

不止抓请求:5种开发场景中的抓包组合策略(含 Charles 等工具)

很多开发者用抓包&#xff0c;只在“接口调不通”的时候。 但在复杂项目中&#xff0c;抓包早已不仅是调错工具&#xff0c;更是开发节奏提速器、协作问题解耦器、架构瓶颈探测器。 关键在于——不同场景下&#xff0c;你要用对方法、配对工具。 以下是我根据日常开发实战&a…

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…

计算机系统大作业——程序人生

计算机系统 大作业 题 目 程序人生-Hello’s P2P 专 业 物联网工程 学   号 2022112820 班 级 2237301 学 生 孟宇航 指 导 教 师 吴 锐 计算机科学与技术学院 2024年…

〈软件安装管家软件目录〉▷Windows系统版

①装机常用 ☞压缩解压WinRAR7-ZIPBandZip360压缩☞文件工具EverythingOneCommander XYplorer ReNamer ☞卸载软件CCleanerIObitUninstallerUninstall toolGeekAutodesk卸载Adobe卸载Ashampoo☞驱动软件驱动人生&#xff08;离线版&#xff09;驱动精灵&#xff08;离线版&…

CentOS Stream 8 Unit network.service not found

一、问题现象 在 CentOS Stream 8 操作系统中&#xff0c;配置完静态IP 信息&#xff0c;想重启网络服务。 执行如下命令&#xff1a; systemctl restart network 提示信息如下&#xff1a; Failed to restart network.service: Unit network.service not found. 二、问题…

极空间z4pro配置gitea mysql,内网穿透

极空间z4pro配置gitea mysql等记录&#xff0c;内网穿透 1、mysql、gitea镜像下载&#xff0c;极空间不成功&#xff0c;先用自己电脑科学后下载镜像,拉取代码&#xff1a; docker pull --platform linux/amd64 gitea/gitea:1.23 docker pull --platform linux/amd64 mysql:5.…

[假面骑士] 龙骑浅谈

作为一个伪二次元的我&#xff0c;总感觉目前没有什么好番可追。结果某一天在小破站刷到了一个假面骑士相关的视频&#xff0c;我就突发奇想&#xff0c;要不把假面骑士补完算了。 搜了搜&#xff0c;版权全在企鹅哪儿&#xff0c;不想充&#xff0c;于是去找了某盘的资源。果…

F5 GSLB 最佳实践:如何手动将Wide IP 故障转移到另一个数据中心

下面简要介绍如何手动将 Wide IP(用于 DNS 负载均衡)故障转移到另一个数据中心,并提供一些最佳实践。假设您使用 F5 BIG-IP DNS(以前称为 GTM)管理一个 Wide IP,该 IP 引用位于不同数据中心的虚拟服务器 (VIP)。 典型的 GSLB (BIG-IP DNS) 设置 Wide IP:表示您想要全局负…

FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ FART 脱壳 fartthread 方法在 app 启动的时候&#xff08;ActivityThread&#xff09;开启 fart 线程&#xff0c;休眠 60 秒&#xff0c;等待 app 启动完成后…

在maven项目中 继续增加maven 项目

背景项目 基于若依项目 由于若依项目都是Maven项目有父子结构因此自己建项目 也需如此管理 添加子Maven项目 利用idea 自带工具 maven archetype 这里选 webapp 骨架 在这里构建自己的项目架子即可 将 这个架子加入到启动类中

网络攻防技术十四:入侵检测与网络欺骗

文章目录 一、入侵检测概述二、入侵系统的分类三、入侵检测的分析方法1、特征检测&#xff08;滥用检测、误用检测&#xff09;2、异常检测 四、Snort入侵检测系统五、网络欺诈技术1、蜜罐2、蜜网3、网络欺骗防御 六、简答题1. 入侵检测系统对防火墙的安全弥补作用主要体现在哪…

吴恩达MCP课程(5):mcp_chatbot_prompt_resource.py

前提条件&#xff1a; 1、吴恩达MCP课程&#xff08;5&#xff09;&#xff1a;research_server_prompt_resource.py 2、server_config_prompt_resource.json文件 {"mcpServers": {"filesystem": {"command": "npx","args"…

【Linux】Linux基础指令3

1. which指令 功能&#xff1a;搜索系统指定的命令 2. whereis指令 功能&#xff1a;⽤于找到程序的源、⼆进制⽂件或⼿册 3. grep指令 语法&#xff1a; grep [ 选项 ] 搜寻字符串 ⽂件 功能&#xff1a;在⽂件中搜索字符串&#xff0c;将找到的⾏打印出来 常⽤选项&…

李沐《动手学深度学习》d2l安装教程

文章目录 最新回答报错提醒安装对应版本安装C工具和Windows SDK 最新回答 安装旧版本即可 pip install d2l0.17.0 WARNING: Ignoring invalid distribution -pencv-python (e:\python3.10\lib\site-packages) Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple C…