集合与集合操作:

  集合也是无序的,主要作用有去重和关系测试。

  集合的表示方法为set_2={2,7,9,13,8}

  列表转化为集合:list_1=[2,3,4,5,13,4,5],set_1=set(list_1)#列表可以存在重复元素,集合自动去重。

  求交集:set_3=set_1.intersection(set_2)

      或者 set_3=set_1&set_2

  求并集:set_4=set_1.union(set_2)

      或者set_4=set_1|set_2

  求差集:set_5=set_1.difference(set_2)       #这与set_6=set_2.difference(set_1)不同

      或者set_5=set_1-set_2                  #set_6=set_2-set_1

  求对称差集:set_7=set_1.symmetric_differnce(set_2)#对称差集,相当于set_1和set_2的并集减他们的交集

       或者set_7=set_1^set_2

  判断是否为子集:set_3.issubset(set_1)   #如果set_3是set_1的子集,得到True,反之False

         或者set_3<=set_1

  判断是否为母集:set_4.issuperset(set_1)  #如果set_4是set_1的母集,得到True,反之False

          或者set_4>=set_1

  判断交集是否为空集:set_5.isdisjoint(set_6)  #判断set_1和set_6交集是否为空集,是的话为True

  集合添加:添加一个元素:set_1.add(10)

        添加多个元素:set_1.update([7,8,9])

  删除:set_1. remove(8)  #删除括号中的元素,不存在会报错

     set_1.discard(99) #删除括号中的元素,不存在则不进行操作

  集合长度:len(set_1)#集合的长度,即集合中元素的个数

  判断元素在不在集合中:0 in set_1 #在的话得到True,不在为False。与列表、字典、文件类似。

  判断元素在不在集合中:0  not in set_1 #在的话得到False,不在为True。与列表、字典、文件类似。

  print(set_1.pop())#任意删除一个元素,并返回这个元素

文件操作:

  文件操作步骤:打开---》操作----》关闭

  #open('template')打开文件

  #open('template').read()打开文件并阅读

  f=open('template','a',encoding='utf-8'),f为给打开文件内存命名,方便操作。#括号内为(文件名,读写权限:【默认为只读’r';‘w'为只写、创建文件、原先文件被         覆盖掉;'a'append缩写、追加、可续写、原先文件不被覆盖、不能读,只写在最后;‘r+'为读和追加模式;’w+‘为写和追加模式,创建新文件,可读,内容只能写          在最后面; 'a+'为追加和读模式,f.tell()一直在最后位置】,指定编码方式)。文件句柄,包含文件名、字符集、硬盘上起始位置.

  #f=open('template','rb')#二进制模式打开,只读

  {data=f.read()#读完后,光标在最底下

  data2=f.read()#从最底下开始读,data2读不到数据}

  追加模式下,写:

  f.write('But I will practice English since today.\n')#需要换行自行加\n

  f.write('Are you kiding?\n')

  print(f.readable())#判断文件是否可读

  print(f.writable())#判断文件是否可写
  f.close() #文件保存

  f.readline()#只读文件句柄所在的那一行

  f.readlines()#将文本转换成列表,换行符会显示

  '''for i in range(5):

  print(f.readline())#读前5行'''

  第五行不打印,打印’-----我是分割线-------‘method1,其他行照打:

    count=0
    for line in f:#内存内只存一行,节省空间
        count += 1
        if count==5:
            print('我是分割线'.center(50,'-'))
            continue
        print(line.strip())#推荐使用
    f.close() 
View Code

  print(f.tell())#打印文件句柄(光标)的位置,按字符个数计算

  f.seek(0)#将文件jubing(光标)置回0的位置
  f.read(10)#读10个字符,尽量别用

  encoding:

  print(f.encoding)#打印编码方式

  print(f.name)#打印文件名

  print(f.isatty())#判断是否为终端设备,比如打印机等
  print(f.readable())#判断是否可读
  print(f.seekable())#判断句柄是否可置回
  print(f.writable())#判断文件是否可写
  f.flush()#强制刷新内存,将内存写入硬盘

  print(f.closed)#判断文件是否关闭

  f.truncate()#括号内不写,默认全删

  f.truncate(10)#从头开始截断到10个字符

文件修改:

  需要打开两个文件,一个读,一个写,最后将写好的文件将原文件覆盖掉

  例如:

    Old_f=open('template','r',encoding='utf-8')

    new_f=open('template3','w',encoding='utf-8')    
      for line in Old_f:
        if 'woshi' in line:
            line=line.replace('woshi','哈哈')#替换
        new_f.write(line)
        new_f.flush()
    Old_f.close()
    new_f.close()
 
View Code

  with用法:

with open('template3','r',encoding='utf-8') as f,\
        open('template','r',encoding='utf-8') as new_f:#python开发规范一行不超过80个字符
        #不需要关闭,缩进结束自动关闭
        pass
View Code    

字符编码:

  所有编码需要通过Unicode进行转换,转成unicode叫decode,unnicode转成其他叫encode。

  import sys

  print(sys.getdefaultencoding())#打印系统默认编码

  s='啦啦队'#默认为unicode编码
 print(s.encode('gbk'))#转成了gbk编码,变成了bytes类型
 print(s.encode('utf-8'))#转成了utf-8编码,变成了bytes类型
 print(s.encode('gb2312').decode('gb2312').encode('utf-8'))#转成了utf-8编码,变成了bytes类型
View Code 

函数: 

  面向对象:特征:类---》定义class
  面向过程:特征:过程---》定义def,过程不需要return
  函数式编程:特征:函数----》定义def,函数需要return

#函数例子
def function1(x,y):#括号内定义变量
    '此处添加描述'
    y=x*y+1
    print(x,y)#输出x,y的值
    return y#返回值并结束函数
    print('contune or not')#这条语句不会运行

def function2(x,y):#括号内定义变量
    '此处添加描述'
    y=x+y+1
    print(x,y)#输出x,y的值
    return y,1,'hello',['a','b'],{'name':'jack'}#返回值并结束函数,这些都可以返回,存到一个元组当中
    #函数没有返回值时,返回None;返回一个值时,返回objec;返回多个值时,返回tuple

#过程例子,相当于没有返回值的函数
def process(x,y):
    '此处添加描述'
    y=y-x
    print(x,y)

#调用函数和过程
n=function1(2,3)#得出返回值,赋值给n,需要和x,y位置对应,位置参数调用
m=process(n,10)#得到None,没有返回值
z=function2(x=2,y=3)#这样不需要位置对应,关键字参数调用
i=function1(2,y=3)#混用时,位置参数必须写在关键字参数前面,且不能多个实参对应一个形参
print('return of function1 is %d'%n)
print('return of function1 is %d'%i)
print('return of process is %s'%m)
print(z)
过程(函数)作用:1、代码重复利用;
               2、可扩展和保持一致性
def function3(x,y=4):#括号内定义变量,此时y为默认参数,不用实参给y赋值时,y=2,赋值时,y=实参
    '此处添加描述'
    y=x*y+1
    print(x,y)#输出x,y的值
    return y#返回值并结束函数
    print('contune or not')#这条语句不会运行
print(function3(1,2))
print(function3(1))
#实参数目不固定,列表参数组
def function4(*args):
    '形参为元组的示例'
    x=args[0]-args[1]
    print(args)
    return x
print(function4(7,2,4))#此时输入实参不固定
print(function4(*[2,1,3,45,5]))#相当于*_tuple=*[2,1,3,45,5],生成元组
#参数组和形参交替使用,参数组必须放后面
def function5(x,*args):
    print(x)
    print(args)
    return 0
print(function5(1,234,5,67,8))
#参数组为字典**kwargs把关键参数,转化为字典的方式key-value,生成字典
def function6(**kwargs):
    print(kwargs)

print(function6(name='Jack',age=23,stature=1.7))#关键字形参转化为key,实参转化为value,参数组只能放最后
print(function6(**{'name':'Jack','age':23,'stature':1.7}))#效果和上一行一样
def function7(name,age=23,*args,**kwargs):#参数与参数组混用,参数组一定放最后面
    print(name)
    print(age)
    print(args)
    print(kwargs)
    function1(1,2)#函数嵌套
    return 3
print(function7('wulihui',25,22,'holle','good',habby='play games'))#从上到下执行,调用的函数必须先定义
View Code

局部变量和全局变量:

age=23
def change_name(name):#函数内部的变量叫做局部变量,作用域为仅在函数内,local variable
    print('old name:',name)#print('old name:',name,age)此处可以打印age,可以的到全局变量age的值
    name=input('please input newname:')#修改局部变量name
    print('new name:',name)
name=input('name which need to change:')#输入全局变量name
change_name(name)#将全球变量name赋值给局部变量name
print(name) #这个name为全局变量,找到的是第七行的name,整个程序中都生效的变量,global variable,文件第一级定义
#如何在函数内部修改全局变量
# age=23
# def change_name():#函数内部的变量叫做局部变量,作用域为仅在函数内,local variable
#     global age,name#声明age,name为全球变量
#     age=25
#     print('old name:',name)
#     name=input('please input newname:')#修改全局变量name
#     print('new name:',name)
# name=input('name which need to change:')#输入全局变量name
# change_name()#将全球变量name赋值给局部变量name
# print(name) #这个name为全局变量,找到的是第七行的name,整个程序中都生效的变量,global variable,文件第一级定义
# print(age)
#尽量别在函数里改全局变量,因为函数可能会被引用很多次,全局变量都不知道是哪里改掉的
#字典、列表、集合、类函数里可以改全局变量里的值
name_list=['nvbu','diaocan','luna']
def change_name2():
    print(name_list)
    name_list[0]='ali'
    print(name_list)
change_name2()
print(name_list)#打印出['ali', 'diaocan', 'luna']
#当全局变量与局部变量同名时:在定义局部变量的子程序内,局部变量起作用;在其他地方全局变量起作用
View Code

递归:如果一个函数在内部调用自身,那这个函数就是递归函数

  递归特性:

        1、具有明确的结束条件。

        2、每次进入更深一层递归时,问题规模相比上一次递归有所减少。

        3、递归效率不高,递归层数过多会导致栈溢出。

    例子:

    def half(n):
        "devide by 2,then round number"
        print(n)
        if n>0:
            n=int(n/3)#int,取整的作用,不四舍五入
            return half(n)
        else:
            return 0

    half(8)
View Code

函数式编程:指过函数嵌套进行编程,简洁但是比较难看懂

高阶函数: 将一个函数作为变量或参数,内置到另一个函数当中

  例如:

 def add(a,b,f):
        c=f(a)+f(b)
        return c
    print(add(2,-3,abs))#f=abs()
 
View Code