python之day3

今天是 武sir 第一天给我们讲课,讲的非常精彩。

进入正题:

今天所学的知识点包括:

1,set

  无序,不重复,可嵌套。

2,函数

  定义函数,函数体不执行,只有调用函数时,函数体才执行。

3,三目运算:

4,内置函数简介:

5,文件操作:

  包括打开文件,操作文件,关闭文件。

#######################################

好,我们详细说一下今天的收获。

一,引入类:

  通过对字符串的讲解,我们引入了类的概念,将所有的字符串归纳起来,将他们的所有功能,写到字符串类里面,使用这些功能时,直接调用即可。

对于其他的字典,列表,元组等都是大同小异的,他们都属于类,之后自建的类,我们都可以这么理解。

二,集合(set): 

  首先我们创建一个列表,list((11,2,33,44)),,list__init__,内部会执行for循环(11,22,33,44)。

  set也是一样,s=set()#创建集合,li = [11,22,33,44],s1 =set(li),print(s1)

  1, 创建集合的方法:

    s1 = {11,22}

    s2 = set()

    s3 = set([11,22,33,44])

  

  2,集合的功能:

    1),差异性判断:

    s1 = {11,22,33}

    s2 = {22,33,44}

    s3 = s1.difference(s2)

    s1中有,s2中没有的。

    print(s3)

    {11}

    s3 = s1.symmetric_difference(s2)

    s1,s2中的差异,包括s1中有的s2没有的,以及s2中有的s1没有的

    print(s3)

    {11,44}

    如果是s1.difference_update(s2)就直接将结果{11}赋值给s1

        s1.symmetric_difference_update(s2) 同上

      总之出现update就将值直接付给使用这个功能的变量。

    2)删除:

    s1 = {11,22,33,}

    s1.discard(11) ----删除11,如果删除111,不存在的元素不会报错

    s1.remove(11) ----删除11,如果删除111,不存在的元素会报错

    s1.pop() ----随机删除元素。不经常使用

    建议使用discard 出现不存在的元素不会报错退出,remove会退出。与字符串中的find和index 索引功能类似

    3)并集和交集:

    s1 = {11,22,33}

    s2 = {22,33,44}

    s3 = s1.intersection(s2)

    #{33,22}

    这个是交集(intersection)。可以用于找到相同的元素,然后可以进行判断。

    s1 = {11,22,33}

    s2 = {22,33,44}

    s3 = s1.union(s2)

    #{33,22,11,44}

    这个是并集(union)。可以应用到2个集合的所有元素,进行去重

  小练习

    题目:

      固定资产管理

这道题主要应用在cmdb 资产管理里面,可以通过集合的不重复性,可嵌套的特点。将老数据和新数据进行对比,帮我们确认哪些资产有过变动,有哪些变动。

 下面是相关代码:   

old_dic ={'#1':8,
          '#2':4,
          '#4':2}
new_dic = {'#1':4,
           '#2':4,
           '#3':2}

old_set = set(old_dic.keys())
new_set = set(new_dic.keys())

del_list = list(old_set.difference(new_set))
add_list = list(new_set.difference(old_set))
updat_list = list(old_set.intersection(new_set))
print(del_list,add_list,updat_list)

for i in updat_list:
    if old_dic[i] != new_dic[i]:
        print(i,)
test01

 

三,函数详解:

  1,定义函数:

    

    上图:是函数的定义方法。尽量在函数命名的时候能够让人直观的知道这个函数的用途,方便实用。

  2,执行函数:

    练习:发邮件

    

def mail():
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddr


    msg = MIMEText('邮件内容', 'plain', 'utf-8')
    msg['From'] = formataddr(["xxx",'xxx@126.com'])
    msg['To'] = formataddr(["xx",'xxx@qq.com'])
    msg['Subject'] = "主题"

    server = smtplib.SMTP("smtp.126.com", 25)
    server.login("xxx@126.com", "xxx")
    server.sendmail('xxxx@126.com', ['xxxx@qq.com',], msg.as_string())
    server.quit()

mail()
sendmail

    在没有参数的情况下,直接mail()就可以执行整个函数。

  

  3,参数:

    def send(xxoo,content,xx='d'):  #xxoo和content就是形式参数,xx是默认参数,必须放在最后
         print(xxoo,content,xx)
#      return True
       · return xxoo        #返回值 出现返回值整个函数就终止。

    #res = send('a','b','c')
    #res = send('a','b')
    res = send(content='a',xxoo='b') #直接定义形式参数,可不按照顺序
    print(res)

   默认参数就是在函数调用时可以不输入,他已经有了默认的值。

    详解return:

    

  return出来的值,就是这个函数的执行结果,可以通过该结果进行判断,函数是否执行成功或者失败。

  res = send() 是函数的执行方法。

    

    详解形式参数:

    

  形式参数在调用时必须赋值。而且必须按照顺序一一对应。

  当然也可以进行具体指定,比如在调用时 send(content= "SB",xxoo = em, xx = "ok")这样顺序不一致也没事。  

    动态参数:
       *args   -----*形式参数会接收全部参数,以元祖形式出现(动态参数)
       **args  -----** 指定参数 变成字典 -**形式参数,字典
       万能参数:* **   *在前 ** 在后

  举例说明:

     

      1)*args      

    

def f1(*args):
    print(args,type(args))

li = [1,2,3,4,1,23,]
#f1(li)
f1(li)

结果li会整个变成一个元组中的一个元素
([1, 2, 3, 4, 1, 23],) <class 'tuple'>

def f1(*args):
print(args,type(args))

li = [1,2,3,4,1,23,]
#f1(li)
f1(*li)
这样就会list就会变成元组,不再是列表。而之前列表中的元素,会变成元组中的元素。
(1, 2, 3, 4, 1, 23) <class 'tuple'>

    2)**kwargs

    


def f1(**kwargs):
print(kwargs,type(kwargs))

li = {'k1':'v1','k2':'v2'}
f1(k1='v1')
这样会对应出一个字典
{'k1': 'v1'} <class 'dict'>

def
f1(**kwargs): print(kwargs,type(kwargs)) li = {'k1':'v1','k2':'v2'} #f1(k1='v1') f1(**li)

{'k1': 'v1', 'k2': 'v2'} <class 'dict'>

      3)万能函数:

    

    

def f1(*args,**kwargs):
    print(args)
    print(kwargs)

f1(1,2,3,4,k1='v1')
1,2,3,4会变成元组中的元素。
k1='v1'会变成字典
(1, 2, 3, 4)
{'k1': 'v1'}

并且是打印两行

  4,补充:

    字符串format:

    

  {0} {1}按照顺序进行赋值。

    函数创建:
       函数参数传递是引用进行传递。 

      

  f1先引用内存里的a1+a2

  之后有引用了a1*a2

  所以在调用函数的时候 返回的结果就是 a1*a2

  

      

  首先先将a1加了999,函数调用了l1 这个列表,l1就加了999

  结果就是 :[11, 22, 33, 44, 999]

      
       全局变量(作用域)----所有的地方都能读 但是会优先用自己变量
                     ----列表字典可修改,不可以重新赋值

      

    5, 三目运算:
      if 1==1:
        name = 'alex'
      else:
         name = 'sb


       name = 'alex' if 1==1 else 'sb'  #三目运算表达式。

    6,lambda:

      

def f1(a1):
    return a1 + 100

f2 = lambda a2,a1=10:a2+120+a1
res1 = f1(1)
res2 = f2(20)
print(res1)
print(res2)

在lambda中,a1,a2就是参数 a1是默认参数,:后面是返回值就是150

    7,内置函数简介:

      abs()绝对值  
      all()
      any()

      n = all([1,2,3,4,45,5,0])
      print (n)


      bin() 10 -2
      oct() 10 -8
      hex() 10 -16
      进制的 转换

      代码测试:

      

n = abs(-10)
print(n)

n1 = all([10,1,2,3,4,5,0])
print(n1)

n2 = any([1,2,3,0,[]])
print(n2)

print(bin(10))
print(oct(10))
print(hex(10))

      字符问题:

    

    代码如下:

    

s = '李杰'
n = bytes(s,encoding='utf-8')
print(n)

将汉字转化为直接格式
b'xe6x9dx8exe6x9dxb0' f
=open('db','ab') f.write(bytes('立即',encoding='utf-8')) f.close()

用字节格式打开,要用字节进行写入。 f
= open('db','rb') n=f.read() print(n,type(n))

四,文件处理:

    

   1,打开文件,
      r 读
      w 写 先清空
      x 文件存在就报错,不存在,创建并写内容=w
      a 追加  --- 永远会写在最后

      常用的r+可以按照指针进行修改
      a+永远会写在最后
      w+会清空后再写

      如果模式无B按照字符读取。
      seek按照字节找位置(永远是字节)
      tell 获取当前的指针位置以字节的位置调整

      

   2,操作文件:
      read() 无参数,读全部
        有参数 b 按照字节
          无b按照字符
        flush()强刷
      readline 仅仅读取一行
      truncate 截断,指针后面的 清空。
      for循环文件对象,
        for line in

    3,关闭文件:

      close()

      with open('db') as f:

        pass

    **python3最新推出同时开两个文件:

    

    可以用于相互的拷贝,已经备份更新等。
    
    
以上是这节课所学到的知识。

#########################黄金分割线#############################

以下是我的一些感想:

  set(集合):是无序的,不可以重复的,可以嵌套。他和列表很相似,但是也有一些不同,比如他不允许重复。

        他在差异性判断中很有用处,可以通过集合来确认出两组数据有什么不同,有什么相同。在比较数据前后变化是很有用处。

  函数:函数非常重要,我认为函数就是程序中的功能,也可以说程序就是通过一个个函数来完成他的工作。每一个函数就是这个程序的一个功能,而且函数           可以增强整个程序的灵活性,需要那种功能就通过函数来完成在添加到想用的位置即可。

    至于形式参数,默认参数,动态参数,还有内置函数等,主要看个人的习惯,那种用的熟,哪种更方便,就用哪种,当然要明确程序的可用性,减少         bug

  关于类的概念:

    我感觉所有的对象都属于类,每个类中都有相应的功能,类中的对象可以通过这些功能来完成复杂的程序。

  文件处理:

    单个文件的处理还好理解一下,但是一定要注意for循环的这个区间,以及缩进问题,还有continue break的应用。

    我认为多个文件的操作是一个难点,尤其是读一个文件再写到另一个文件,其中的逻辑性非常强,很容易迷糊,需要多加练习。

    谢谢

    

    

     

    

    

    

  

  

  

原文地址:https://www.cnblogs.com/aaron-shen/p/5518607.html