Python开发Day03

基本类型的补充:

  • set集合

    • 介绍:

      • set集合是一个无序且不重复的元素集合,我们可以使用他来对比,去重,查看重复项(交集),不重复项(差集),a有很多元素,b中有几个元素但是元素都和a中元素相同这样可以判断a是不是b的父集,查看两个合并后去掉两个集合中的重复元素。
    • 集合元素

      • a={1,2,3,4,5,6,7,8,9}
      • b={3,4,5,6}
    • 方法:

      • 判断a集合是不是b集合的父集或是不是子集:

        print(a.issuperset(b))  #判断a集合是不是b集合的父集,也就是说b中有的a中都有,使用True或者False返回
        print(a.issubset(b))  #判断a集合是不是b集合的子集,也就是说a中有的b中都有,使用True或者False返回
        执行结果:
        True
        False

        判断a集合是不是b集合的父集或是不是子集

      • 清空集合:

        a.clear()
        print(a)
        执行结果:
        set()

        清空集合

      • 向集合中添加一个元素:

        a.add(10)
        print(a)
        执行结果:
        {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

        向集合中添加一个元素

      • 向集合中添加多个元素:

        a.update([‘a‘,‘b‘,‘c‘,‘d‘])
        print(a)
        执行结果:
        {1, 2, 3, 4, 5, 6, 7, 8, 9, ‘a‘, ‘c‘, ‘d‘, ‘b‘}

        向集合中添加多个元素

      • 删除a集合中的3元素(这个方法如果集合中不存在这个元素会报错):

        a.remove(3)
        print(a)
        执行结果:
        {1, 2, 4, 5, 6, 7, 8, 9}

        删除a集合中的3元素

      • 删除a集合中的8元素(该方法若是集合中没有这个元素不会报错):

        a.discard(8)
        print(a)
        执行结果:
        {1, 2, 3, 4, 5, 6, 7, 9}

        删除a集合中的8元素

      • 随机删除一个元素,因为集合是无序的所以它默认是删除最后一个可是最后一个不固定:

        a.pop()
        print(a)
        执行结果:
        {2, 3, 4, 5, 6, 7, 8, 9}

        随机删除一个元素

      • 输出两个集合中都存在的元素,产生一个新的值,如果需要用变量接收,或者直接查看(交集)。

        print(a.intersection(b))
        执行结果:
        {3, 4, 5, 6}

        输出两个集合中都存在的元素

      • 对比两个集合中都存在的元素,修改原来的元素(交集)。

        a.intersection_update(b)
        print(a)
        执行结果:
        {3, 4, 5, 6}

        对比两个集合中都存在的元素

      • 判断两个集合中有没交集。

        print(a.isdisjoint(b))
        执行结果:
        False

        判断没有交集

      • 将两个集合合并,可以达到去重的效果(并集),如果需要值需要将执行结果给一个变量它不会修改原来的集合。

        print(a.union(b))
        执行结果:
        {1, 2, 3, 4, 5, 6, 7, 8, 9}

        将两个集合合并

      • 拿出集合a中存在的b中不存在的,如果需要值需要将执行结果给一个变量它不会修改原来的集合(差集)。

        print(a.difference(b))
        执行结果:
        {8, 1, 2, 9, 7}

        集合a中存在b中不存在

      • 拿出集合a中存在的b中不存在的,并修改a集合(差集)。

        a.difference_update(b)
        print(a)
        执行结果:
        {1, 2, 7, 8, 9}

        拿出集合a中存在b中不存在的值,修改a集合

      • 在a集合或b集合中,但不会同时出现在二者中(对称差集),如果需要值需要将执行结果给一个变量它不会修改原来的集合。。

        print(a.symmetric_difference(b))
        执行结果:
        {1, 2, 7, 8, 9}

        在a或b集合中的元素,不会同时出现在另一个集合中的

      • 在a集合或b集合中,但不会同时出现在二者中(对称差集),直接修改a集合:

        a.symmetric_difference_update(b)
        print(a)
        执行结果:
        {1, 2, 7, 8, 9}

        对称差集

三目运算(三元运算):

  • 介绍:

    • 三目运算就是是对简单的条件语句的缩写,让之前需要3-4行的特殊代码写成一行:
    • 使用方法:

      c=0
      name=‘Wu‘ if c== 0 else ‘Qi‘  #先做if判断如果c等于0那么name的值就是Wu否则值为Qi
      print(name)
      执行结果:
      Wu

深浅拷贝:

  • 数字和字符串

    • 对于数字和字符串而言深浅拷贝、赋值,没有是没意义,因为他们如果相同永远指向同一个内存地址:

      a=‘hello‘
      b=‘hello‘
      c=1
      d=1
      print(id(a))    #id()查看变量的内存地址print(id(b))print(id(c))print(id(d))
      执行结果:
      1902418750296
      1902418750296
      1521807152
      1521807152    

  • 其他基本数据类型的深浅拷贝赋值:

    • 介绍:

      • 赋值就是你创建了一个变量然后有值,又创建一个变量给的值指向的就是你之前创建的变量名。

        n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
        n2 = n1
        print(id(n1))    #查看n1字典在内存的位置
        print(id(n2))       #查看n2字典在内存的位置
        print(id(n1[‘k1‘]))     #查看n1字典中k1值的内存位置
        print(id(n2[‘k1‘]))       #查看n2字典中k1值的内存位置
        执行结果:
        1961536305736
        1961536305736
        1961536697040
        1961536697040

        赋值的拷贝分析

        

  • 浅拷贝:

    • 介绍:在内存中只创建第一层数据结构:

      • 分析:

        import copy #拷贝模块
        n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
        n2 =copy.copy(n1)    #浅拷贝n1
        print(id(n1)) #输出n1在内存的位置
        print(id(n2)) #输出n2在内存的位置
        print(id(n1[‘k3‘])) #输出n1中列表在内存的位置
        print(id(n2[‘k3‘])) #输出n2中列表在内存的位置
        执行结果:
        2162448251464
        2162448682888
        2162450147144
        2162450147144

        浅拷贝分析

        

  • 深拷贝:

    • 介绍:

      • 在内存中将所有的数据重新创建一遍,除了字符串和数字使用的还是原来的内存地址,因为Python对他们做了优化。
    • 深拷贝的分析:

      import copy
      n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
      n2 = copy.deepcopy(n1)    #深拷贝
      print(id(n1))     #查看n1字典的内存地址
      print(id(n2))     #查看n2字典的内存地址
      print(id(n1[‘k3‘]))       #查看n1字典中的k3值的内存地址
      print(id(n2[‘k3‘]))       #查看n2字典中的k3值的内存地址
      print(id(n1[‘k1‘]))          #查看n1字典中的k1值的内存地址
      print(id(n2[‘k1‘]))        #查看n2字典中的k1值的内存地址
      执行结果:
      2398849710664
      2398850108872
      2398851605768
      2398851575624
      2188442383056
      2188442383056

      Python深拷贝分析

函数:

  • 背景:

    • 在学习函数之前,我们一直遵循:面向过程编程,就是所谓的从上到下的执行实现功能,有时候会有很多重复的代码我们就需要复制粘贴,这样就会导致我们的开发效率,而且容易出错。

    • 函数的使用:假设我们有一个脚本在不断的循环查看服务器的各个状态是否正常如果不正常就会发送邮件但是邮件发送使用面向过程的大方会有很多重复的代码既浪费空间还浪费时间。

      while True:
      
          if cpu利用率 > 90%:
              #发送邮件提醒
              连接邮箱服务器
              发送邮件
              关闭连接    
      
          if 硬盘使用空间 > 90%:
              #发送邮件提醒
              连接邮箱服务器
              发送邮件
              关闭连接
      
          if 内存占用 > 80%:
              #发送邮件提醒
              连接邮箱服务器
              发送邮件
              关闭连接

      面向过程的编写方式

      def 发送邮件(内容)
      
          #发送邮件提醒
          连接邮箱服务器
          发送邮件
          关闭连接
      
      while True:
      
          if cpu利用率 > 90%:
              发送邮件(‘CPU报警‘)
      
          if 硬盘使用空间 > 90%:
              发送邮件(‘硬盘报警‘)
      
          if 内存占用 > 80%:
              发送邮件(‘内存报警‘)

      函数式编程的编写方式

      可以看出来上面的两种方法第二种要比第一种重用性和可读性要好很多,这就是面向过程和函数式编程的区别

    • 解释:

      • 函数式编程:将写好的某些功能代码封装到函数中,以后便不需重复编写,直接调用函数就可以。(函数式编程最重要的是增强代码的重用性和可读性
      • 面向对象:对函数进行分类和封装,让开发者开发的效率“更快更好更强...”
      • 面向过程:这个代码从上到下的执行。
  • 定义和使用

    • 函数结构:

      def 函数名(参数):       
      
          ...
          函数体
          ...
          返回值

      函数结构

    • 函数的定义主要有以下几点:

      • def:表示函数的关键字。
      • 函数名:函数的名称,以后根据函数名调用函数。
      • 函数体:函数中进行一系列的逻辑计算。
      • 参数:为函数体提供数据
      • 返回值:当函数执行完毕后,给调用者返回需要的数据。
  • 返回值

    • 解释:

      • 函数是一个功能块,该功能到底执行是否成功,需要通过返回值来告知调用者。
    • 列如:

      def test():
          a=0
          if a == 0 :
              return ‘成功‘
          else:
              return ‘失败‘
      print(test())
      执行结果:
      成功

      Python函数返回值的例子

  • 参数

    • 解释:

      • 参数可以更好、更准确的去执行处理,因为如果没有参数那么就相当于函数被写死了。
    • 参数例子

      • 如果没有参数将会成为这样,需要写很多函数,调用每一个不同的函数,但是函数内部就是改了一个内容而已,这样就和面向过程变成一样了。

        def CPU报警邮件()
            #发送邮件提醒
            连接邮箱服务器
            发送邮件
            关闭连接
        
        def 硬盘报警邮件()
            #发送邮件提醒
            连接邮箱服务器
            发送邮件
            关闭连接
        
        def 内存报警邮件()
            #发送邮件提醒
            连接邮箱服务器
            发送邮件
            关闭连接
        
        while True:
        
            if cpu利用率 > 90%:
                CPU报警邮件()
        
            if 硬盘使用空间 > 90%:
                硬盘报警邮件()
        
            if 内存占用 > 80%:
                内存报警邮件()

        没有参数的函数

      • 加参数函数,这样我们的可读性变得会很好,而且可以很好的操作。

        def 发送邮件(邮件内容)
        
            #发送邮件提醒
            连接邮箱服务器
            发送邮件
            关闭连接
        
        while True:
        
            if cpu利用率 > 90%:
                发送邮件("CPU报警了。")
        
            if 硬盘使用空间 > 90%:
                发送邮件("硬盘报警了。")
        
            if 内存占用 > 80%:
                发送邮件("内存报警了。")

        加参数的函数

    • 函数中三种不同的参数

      • 普通参数就和我们上面说的一样,但是他必须是有几个形参就要有多少实参,形参就是函数名后面()里的参数个数,实参就是调用函数时的()里写的内容。

        def test(name):      #参数name,(形参)
            return name
        print(test(‘Wu‘))
        执行结果:
        print(test(‘Wu‘))        #执行test函数传参Wu。(实参)
        执行结果:
        Wu

        普通参数

      • 默认参数:

        def test(name=‘None‘):     #默认参数必须在形参后面,也可以理解为写到最后面才可以使用。
            return name
        print(test())
        执行结果:
        None

        默认参数

      • 动态参数一:

        def test(*name):
            return name
        print(test(1,2,3,4,5,7))   #给test函数传很多数字
        执行结果:
        (1, 2, 3, 4, 5, 7)        #输入结果为元组类型的。

        Python动态参数一

      • 动态参数二:

        def test(**name):
            return name
        print(test(name=‘Wu‘,age=20))     #给函数test传实参,多个参数,必须是**=**因为这种动态参数会以字典的形式返回
        执行结果:
        {‘name‘: ‘Wu‘, ‘age‘: 20}

        Python动态参数二

      • 动态参数一和二可以同时使用:

        def test(*args,**kwargs):#python默认提供的动态参数名称*args和**kwargs
            return args,kwargs
        print(test(123,123,234,name=‘Wu‘,age=20))
        执行结果:
        ((123, 123, 234), {‘age‘: 20, ‘name‘: ‘Wu‘})

        Python动态参数同时使用两个

  • 练习:

    • 简述普通参数、指定参数、默认参数、动态参数的区别。
    • 写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
    • 写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
    • 写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
    • 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
    • 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
    • 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

      dic = {"k1": "v1v1", "k2": [11,22,33,44]}

      PS:字典中的value只能是字符串或列表

    • 写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者。

      def func(arg1,arg2):
          if arg1 == 0:
              print arg1, arg2
          arg3 = arg1 + arg2
          print arg3
          func(arg2, arg3)
      func(0,1)

      斐波那契

    • 寻找差异

      # 数据库中原有
      
      old_dict = {
      
          "#1":{ ‘hostname‘:c1, ‘cpu_count‘: 2, ‘mem_capicity‘: 80 },
      
          "#2":{ ‘hostname‘:c1, ‘cpu_count‘: 2, ‘mem_capicity‘: 80 }
      
          "#3":{ ‘hostname‘:c1, ‘cpu_count‘: 2, ‘mem_capicity‘: 80 }
      
      }
      
      # cmdb 新汇报的数据
      
      new_dict = {
      
          "#1":{ ‘hostname‘:c1, ‘cpu_count‘: 2, ‘mem_capicity‘: 800 },
      
          "#3":{ ‘hostname‘:c1, ‘cpu_count‘: 2, ‘mem_capicity‘: 80 }
      
          "#4":{ ‘hostname‘:c2, ‘cpu_count‘: 2, ‘mem_capicity‘: 80 }
      
      }

      选做

      提示是否删除:?
      提示是否新建:?
      提示是否更新:?
      注意:无需考虑内部元素是否改变,只要原来存在,新汇报也存在,就是需要更新,凭自己想法去做。

练习解答在另一篇中出现 !

时间: 2024-08-01 19:39:19

Python开发Day03的相关文章

Python开发Day03(练习解答)

练习一. '''普通参数分为形参.实参,有多少形参,就必须要给函数多少个实参. 指定参数为,假如有name和age两个形参,在给函数参数的时候指定name='****',age='**' 默认参数为必须放在参数的尾部,列如一个name形参,一个age形参,我们可以将name形参放在前面,这样用户必须给函数一个名字,age放在后面默认等于18.(name,age=18) 动态参数:在形参前面加一个*号,可以传入多个参数,在函数内类型会变为元组. 在形为参数前面加两个*号,传入的值为字典类型,相当于

为什么越来越多的企业选择使用Python开发?

近来,Python作为一种功能强大且通用的编程语言而广受好评,它具有非常清晰的语法特点,适用于多种操作系统,目前在国际上非常流行,正在得到越来越多的应用.1.简介    Python,是一种面向对象.直译式的计算机程序语言,具有近二十年的发展历史.它包含了一组功能完备的标准库,能够轻松完成很多常见的任务.它的语法简单,与其他大多数程序设计语言使用大括号不同,它使用缩进来定义语句块.    Python支持命令式程序设计.面向对象程序设计.函数式编程.面向侧面的程序设计.范型编程多种编程范式. 2

Windows下Python开发工具推荐

*  如果只是纯Python开发人员,WingIDE 是不二之选. 优点:短小精悍,启动快.调试快.反应快.Auto-completion快. 没有Eclispe的巨大臃肿.反应迟钝.跛脚的调试功能. 快捷键可以在Emacs,VS,Eclipse等之间自己选择. 个人最喜欢的功能是 Debug Probe,简直是交互式开发的利器. Linux和Wingows下都能用,一个安装包搞定. *  如果是Python和C的混合编程,需要进行mixed-mode C/Python debugging, 则

Window上python开发--4.Django的用户登录模块User

在搭建网站和web的应用程序时,用户的登录和管理是几乎是每个网站都必备的.今天主要从一个实例了解以下django本身自带的user模块.本文并不对user进行扩展. 主要使用原生的模块. 1.User模块基础: 在使用user 之前先import到自己的iew中.相当与我们自己写好的models.只不过这个是系统提供的models. from django.contrib.auth.models import User # 导入user模块 1.1User对象属性 User 对象属性:usern

linux 下安装 mysql 并配置 python 开发环境

1.安装 mysql ,安装过程中将提示设置 root 用户的密码,默认可以设置为 rootadmin . $ sudo apt-get install mysql-server 2.安装 mysql 开发工具(不安装时,安装 MySQL-python 提示错误 "mysql_config not found"). $ sudo apt-get install libmysqld-dev 3.安装 python 的 mysql 库 MySQL-python (首先安装 python-d

Python开发【第一篇】:目录

本系列博文改编自武沛齐老师的原创博文,主要包含  Python基础.前端开发.Web框架.缓存以及队列等内容 ,用于学习记录成长!!! Python开发[第一篇]:目录 Python开发[第二篇]:初识Python

Python开发【第二十二篇】:Web框架之Django【进阶】

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

Ruby与Python开发的环境IDE配置(附软件的百度云链接)

Ruby开发环境配置 1.Aptana_RadRails(提示功能不好,开发Ruby不推荐) 链接:http://pan.baidu.com/s/1i5q96K1 密码:yt04 2.Aptana Studio3(非常非常好,Ruby和Python开发首选,,和Eclipse使用基本完全一样,提示功能完爆Eclipse,而且界面非常漂亮) 链接:http://pan.baidu.com/s/1cFQr2u 密码:vfc4 教程地址:http://www.cnblogs.com/lsgwr/p/5

visual studio 2015 搭建python开发环境,python入门到精通[三]

在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo,这里略带一句,其实就"学习python"而言,比较建议使用pycharm,pycharm可以设置VS或者eclipse等多种IDE的编码,可以让绝大部分其他语言使用IDE的习惯者更容易上手.这一点兼容确实做的很好.不过既然这么多园友要求使用vs开发python的话,就介绍一下visual