python之路第三天

一、集合

1、集合可以帮助列表进行去重操作

2、关系测试(两个列表中的集合)

 1 # 设置集合  集合是必然去重的
 2 list_1= {1, 2, 3, 9, 2, 4} # == list_1 = set([1,2,3,4])
 3 list_2= {1, 2, 9, 0, 10, 33}
 4 list_3= {1, 2}
 5 print(list_1,type(list_1))
 6 list_1=set(list_1)
 7 print(list_1,type(list_1))
 8 
 9 #  关系测试 求交集
10 print(list_1.intersection(list_2))
11 # 运算符的方式
12 print(list_1 & list_2)
13 
14 # 求并集
15 print(list_1.union(list_2))
16 # 运算符的方式
17 print(list_1 | list_2)
18 
19 # 求差集  list1 中有的 list2 中没有的 取出来
20 print(list_1.difference(list_2))
21 # 运算符的方式
22 print(list_1-list_2)
23 
24 # 子集  判断list1 是否是 list2 的子集 返回真假
25 print(list_1.issubset(list_2))
26 print(1,list_3.issubset(list_1))
27 
28 # 判断list 是否是 list2 的父集 返回
29 print(list_1.issuperset(list_2)) # False
30 print(2,list_2.issuperset(list_3)) # True list2 是 list3 的父集
31 
32 # 对称差集  取出 list1 和 list2 都没有的值
33 print(list_1.symmetric_difference(list_2))
34 # 运算符的方式
35 print(list_1 ^ list_2)
36 
37 # 判断list1 和 list2 是否有交集 有返回False 没有返回True
38 print(list_1.isdisjoint(list_2))
39 
40 
41 # 集合添加
42 
43 list_1.add('a')   # 添加一项
44 list_1.update(['b','s']) # 添加多项
45 
46 # 删除
47 list_1.remove('a')  # 删除一项 删除不存在的会报错
48 list_1.pop() # 删除一个随机的值  并返回他的值  无序删除
49 list_1.discard('bbb') # 删除一项  不存在返回None

 二、文件读写

 

# 当文件是win生成的 需要进行转字符编码
# encoding="utf-8" 在开启的文件后面增加字符编码

f = open('file','r',encoding="utf-8")

# read() 读取文件的全部内容 第二次读取无法读取到数据,因为已经到文件的最后一行了

print(f.read())

# 文件读写规范 r(读模式)  w(写模式,是创建一个文件,同名就覆盖了) a(追加 append 加在文件的最后,同样不能读)


f = open('file','w',encoding="utf-8")


f = open('file','a',encoding="utf-8")
文件读写规范 r(读模式)  w(写模式,是创建一个文件,同名就覆盖了) a(追加 append 加在文件的最后,同样不能读)
r+(读写,写是写在最后面 == r和a的组合) w+(写读 先创建一个文件在读 写也是在最后面写) (a+ 追加读写 可以写了)
rb(以二进制的格式读取这个文件) wb(二进制写 )

再循环取文件内容时尽量不要使用将文件存储到内存,在去循环他的方式如以下方式
    for index,item in enumerate(f.readlines()):
        if index == 9:
            print('---------------------------')
            continue
        print(item)

可以采用下面的方式进行遍历

count=0
for line in f:
    if count == 9:
        print('---------')
        count+=1
        continue
    print(line)

下面介绍几种文件的方法

tell() # 查看当前文件指针在那  按照字符的个数计数

seek(0) # 只能回到开头 因为你不知道第n行的字节数是多少

encoding() # 打印文件的字符集编码

fileno() # 返回文件句柄编号

readable() # 判断文件是否能读 返回真假
with open("yesterday", 'r', encoding="utf-8") as f:

    print(f.fileno())  # 返回文件句柄编号

    print(f.readable())  # 判断文件是否能读 返回真假

    print(f.writable())  # 判断文件是否可写  返回真假

    print(f.flush())  # 默认等到缓存满了才会写到文件中 调用方法手动强制写入  buffer的size非常小 用于文件实时写入

    print(f.truncate(10))  # 截断文件内容  无论移动到那里都是从头开始  不输入是从0开始  输入具体数字就从那个字节开始保留之前 后面全部干掉

这里带着写一个小的实用的例子,linux下的进度条如果用python实现 主要通过flush()这个方法 强制写到硬盘来实现

import sys, time


# sys 中一个新的方法 标准输出方式
for i in range(10):

    sys.stdout.write('#')  # 实现同行打印 引用sys模块的 stdout方法1

    sys.stdout.flush()  # 每次刷新强制从缓存写入硬盘平日年他

    time.sleep(1)  # 没循环一次 休眠1秒  让他有中进度条的感觉

三、字符集编码与转换

 

字符集的编码转换严格遵循上面这张图来进行在操作就不会懵逼,unicode被称为万国码,每个国家都的语法他都含有,utf-8是万国码的扩展集

字符编码的转换都是有规律的一个gbk的编码想转换成utf-8需要先转为unicode作为中间者,然后在转为utf-8

当然在转换时也要注意 解码decode成unicode 编码encode成你需要的字符集

同时、在decode和是需要告诉unicode你是什么字符来解码成unicode如下面代码

import sys

print(sys.getdefaultencoding()) # 获取当前系统字符集

msg = "我爱北京天安门"

# 这里可以看到我们解码(decode)成unicode,告诉他我们是utf-8转成unicode,紧接着我们又编码(encode) 这时我们需要告诉计算机,我们要编码的字符集 这里我们要编码成gb2312的格式
msg_gb2312 = msg.decode("utf-8").encode("gb2312")

# ok 以后的字符集编码转换也就相通了,只要记住要们是以unicode来完成中间转换的就好 

gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk")

 

四、函数

函数分为面向三种

 

1、面向对象
2、面向过程
3、函数式编程

函数的特点是 重用(简化代码)、保持一致性、可扩展性

函数是有返回值的方法如下面代码
def demo_fuc():  # 函数有返回值

    '''testing'''

    print("in the demo_fuc")

    demo1()

    return 0
过程是没有返回值的,如下面代码
def demo_fuc1():  # 过程是没有返回值的函数

    '''testing1'''

    print("in the demo_fuc1")

    demo1()

函数之间的传参

形参和实参的区分

#  形参和实参是一一对应的
def demo_parameter(x, y):  # x y 代表形参

    print(x)

    print(y)
demo_parameter(1, 2)  # 12是实参  这是位置参数调用 参数化与位置对应

参数的调用分为位置参数调用、关键字参数调用

demo_parameter(y=3, x=4)  # 关键字调用 与形参顺序无关

demo_parameter(1, y=8)  # 关键参数必须写在位置参数后面

Python中有默认参数的概念

# 默认参数

# 默认参数的特点:默认参数可有可无 非必填像

#  用途:默认安装值 True or false,数据库端口号

def default(x, y=3):  # y 有默认参数

    print(x)

    print(y)

Python中有参数组的概念

# 参数组*args

# 参数组定义完单个* 转成元组

def parameter_group(*args):  # 参数组  只接受N个位置参数 转换成元组的形式

    print(args)


parameter_group(1, 2.3, 3)


def blend_parameter(x, *args):  # 扩展参数 相传多少穿多少 args是规范

    print(x)

    print(*args)

Python中还可以传key value 这种格式的参数 在形参写为**args

def dict_parameter(**args):  # 将传的N个 关键字 参数转成字典的方式  关键字

    print(args)

    print(args['name'])  # 获取字典的value

    print(args['age'])


dict_parameter(name='hyf', age=11)

各种参数的使用是有顺序的看下面代码

# 位置参数、默认参数、可变参数、关键字参数4种一起用的话,必须按照前面的顺序来使用

def All(name, age=18, *args, **kwargs):

    print(name)

    print(age)

    print(args)

    print(kwargs)


All('houyafan', 1, 23)

高阶函数 

def add(a,b,f):

    return f(a)+f(b)

a=add(1,-2,abs()) # 将函数传进去去处理里面的值  没什么卵用 one day i can do it

print(a)

 

五、局部变量

 

1、局部变量只在函数中生效, 这个函数就是这个变量的作用域
2、全局变量是在整个程序都生效的变量
3、函数中是不更改全局变量的 如果要更改需要声明global teacher
4、只有字符串和数字不能在函数里面更改
*****禁忌:不应该在函数里面更改全局变量*****
teacher = 'alxe'


def chang_name():

    global teacher  # 声明更改全局变量  禁忌:不应该在函数里面更改全局变量

    teacher = 'houyafan'

    print(teacher)


chang_name()

print(teacher)

六、递归

 

 递归的定义

 

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归特性:

1. 必须有一个明确的结束条件

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

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,
所以,递归调用的次数过多,会导致栈溢出)
# 最简单的递归函数

def calc(x):

    print(x)

    if int(x/2) > 0:

        return calc(int(x/2))

    print(x)

calc(10)

第三天就到这里  加油  !!!!!!!

posted on 2016-08-11 23:01  houyafan  阅读(245)  评论(0)    收藏  举报

导航