您的位置:首页 > 编程语言 > Python开发

python基础学习三

2019-06-16 07:15 2271 查看

python基础学习3

1集合

2文件操作

3字符编码转换

4函数

5局部变量

6递归

7高价函数

1集合(set)

集合是一个无序的,不重复的数据组合

1.1 集合的表示形式

s = set(1,2,3,4) #创建一个数值集合
t = set("World")#创建一个唯一字符的集合

1.2 集合的作用

作用:
1)去重,把一个列表变成集合,就自动去重了
2)关系测试,测试两组数据之前的交集、差集、并集等关系

#去重
list_first = [1,2,3,6,5,4,3,2,1]
set_first = set(list_first)
print(set_first,type(set_first))   #{1,2,3,4,5,6}  <class 'set'>数据类型为set

#关系测试
set_second = set([3,23,4,12,24,31,6])
#取set_fisrt和set_second的交集
intersection = set_first.intersection(set_second)
print(intersection) #{3,4,6}
#或者可以用符号 “&”
print(set_first & set_second) #{3,4,6}返回同样的结果

#并集
union = set_first.union(set_second)
print(union) #{1, 2, 3, 4, 5, 6, 12, 23, 24, 31}
#或者可以用符号 “|”
print(set_first | set_second)

#差集:只在set_fisrt当中有但在set_second中没有的元素
difference = set_first.difference(set_second)
print(difference) #{1,2,5}
#或者可以用符号 “-”
print(set_first - set_second)#{1,2,5}

difference2 = set_second.difference(set_first)
print(difference2) #{24, 12, 31, 23}

#子集
child = set_first.issubset(set_second)
print(child) # False
#父集
father = set_first.issuperset(set_second)
print(father) #False

set_three = set([3,6])
child2 = set_three.issubset(set_first)
print(child2) #True
#对称差集,就是把两个集合的交集部分去除后的结果
symmetric = set_first.symmetric_difference(set_second)
print(symmetric) #{1, 2, 5, 12, 23, 24, 31}
#或者可以用符号“^”
print(set_first ^ set_second)

#两个集合是否有交集,有交集返回False,无交集则返回True
nu = set_first.isdisjoint(set_second)
print(nu) #False

1.3集合de其他操作

#增、删、改
#添加操作
#1)添加一项
set_first.add(666)
print(set_first) #将666这个数字添加到set_first当中
#2)添加多项
set_first.update([888,999])
print(set_first) #将这个列表当中的数添加到set_first

#删除操作remove,指定删除某个元素
set_first.remove(1)
print(set_first) #将1删除
#随机删除某个元素 pop()操作
print(set_fisrt.pop())

#列表的长度
print(len(set_first)) #6   set_first的长度

#in or not in  某个元素是否在集合当中
pirnt("a" in set_first)  # False

#discard()#删除某一个数字元素
set_first.discard(1)#Remove an element from a set if it is a member.If the element is not a member, do nothing.如果是集合当中的一个元素则删除,如果不是集合当中的元素则不做任何事情
print(set_first)
set_first.discard("aaaaaaaaa")
print(set_first)

2文件操作

2.1 文件操作的流程

1)打开文件,得到文件句柄并赋值给一个变量
2)通过句柄对文件进行操作
3)关闭文件

2.2 打开文件的方法

open("running.txt") #这样就打开running.txt这个文本文档了

2.3 打开文件的模式

打开文件模式的总结:
https://www.cnblogs.com/wzjbg/p/6383518.html
常用的几种模式的总结

#读模式,默认模式
f = open("goodtime","r",encoding="utf-8")
#写模式
f = open("goodtime","w",encoding="utf-8")
#追加模式
f = open("goodtime","a",encoding="utf-8")
#读写模式
f = open("goodtime","r+",encoding="utf-8")

小括号里面的参数分别是:打开的文件的名字,打开的模式,以及编码格式

2.4 读取文件的方法

**read()、readline()、readlines()**这三个方法
1)read():可以在小括号里面写上读取的字节数,限制每次读取的数量。如果不写的话,就会读取真个文件。并将文件内容以字符串的形式存储(对于连续的面向航的处理,它是不必要的。文件大于内存,该方法也不行)

2)readline():每次只读取一行,效率较大,读取较慢
3)readlines(): 一次读取整个儿文件,readlines自动将文件按行处理成一个列表

2.5 写入文件的方法

**write()、writelines()**方法
1)write():这个方法想文件写入一个字符串,但不能写入list
2)writelines():这个方法可以写入列表(列表是有要求的,列表中的元素必须是字符串,否则会报错)

2.6 文件的修改

思路:把需要读取的文件,一行一行的读出来(文件有可能很大,会把内存占满,所以最好一行一行读出来),把需要更改的字符串替换掉,然后在写入到新的文件当中(当然也可以把原先的文件覆盖即文件的名字是一样的)

#修改文件的内容
f = open("goodtime",'r',encoding="utf-8")
f_new = open("file.txt","w",encoding="utf-8")

for line in f:
if "今天心情特别好" in line:
line = line.replace("今天心情特别好","今天我的心情特别好")
f_new.write(line)

f.close()
f_new.close()

#通过脚本传参数来修改文件的内容
import sys
f = open("goodtime",'r',encoding="utf-8")
f_new = open("file.txt","w",encoding="utf-8")
find_str = sys.argv[1]
replace_str = sys.argv[2]
for line in f:
if find_str in line:
line = line.replace(find_str,replace_str)
f_new.write(line)

f.close()
f_new.close()

下面是看到的一个比较好的,修改文件的几种方法,可以借鉴一下
https://www.cnblogs.com/wc-chan/p/8085452.html

2.7 with管理上下文

每当我们打开文件的时候,最后我们总是关闭的,但是关闭这个操作,我们总是忘记写,肿么办?可以用这种方式

#打开一个文件
with open("goodtime","r",encoding="utf-8") as file:
text = file.read()
print(text)

#打开多个文件
with open("file.txt", "r", encoding="utf-8") as file1, \
open("file2.txt", "w", encoding="utf-8") as file2:
content = file1.read()
print(content)
file2.write("我用的是with哦")

2.8 文件操作中的其他方法

seek():用于移动文件读取指针到指定位置。小括号里面写上数字,代表移动多少个字节
flush():Python 文件 flush() 方法是用来把文件从内存buffer(缓冲区)中强制刷新到硬盘中,同时清空缓冲区。
一般情况下,文件关闭后会自动刷新到硬盘中,但有时你需要在关闭前刷新到硬盘中,这时就可以使用 flush() 方法。

2.9 标准文件对象

import sys
sys 模块主要是针对与python解释器相关的变量和方法
sys.stdin 用于所有的交互式输入,包括input()函数
sys.stdout 用于print()的打印输出或者input()函数的提示符
sys.stderr 用于解释器自己的提示信息和错误信息
这三个就是标准输入、标准输出和标准错误流,他们返回的是一个“文件类型”的对象,支持read()、write()、flush()等方法

import sys
print("请输入:")
text_box = sys.stdin.readline()
print(text_box)

print("你好,阳光")
print("你好,云朵")

import sys
sys.stdout.write("你好,阳光" + "\n")
sys.stdout.write("你好,云朵" + "\n")

import sys
text = sys.stdout.write("你好,阳光")
text2 = sys.stdout.write("你好,云朵")
print(text)
print(text2)

#模拟进度条
import sys,time
for i in range(20):
sys.stdout.write("▉")
sys.stdout.flush()
time.sleep(0.5)

3字符编码yu转换

字符编码与转换详解,转载一篇写的非常好的文章,可以借鉴一下:
http://www.cnblogs.com/luotianshuai/articles/5735051.html

4函数

4.1 函数与函数式编程

我们数值的编程方式有两种:分别是面向对象和面向过程。其实无论哪种都是一种编程的规范或者教给我们如何变成的方法论。除了这两种外其实还有更加古老的一种编程方式,也就是函数式编程

4.2 函数

数学中的函数:如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数,自变量x的取值范围叫做这个函数的定义域
编程语言中函数的定义:函数是逻辑结构化和过程化的一种编程方法

#python中定义函数
def add(x):
"""这个函数是自身加一"""
x += 1
return x

函数式编程就是:先定义一个数学函数,然后按照这个数学模型用编程语言去实现它。

4.3 函数的作用

作用:
1)减少重复代码
2)保持代码的一致性(改动的时候只需要改动一处即可)
3)使程序变得以拓展

4.4 函数的返回值

return的值
没有定义return,解释器会隐式的返回None
return返回多个值时,会把多个值放到一个元组当中的返回

def test():
print("这是test3")
return 1,"hi",[1,2,3,4]
test() #这是test3    (1,"hi",[1,2,3,4])

总结:
return数为0:返回None
return数为1:返回object(python当中任何一个数据类型都是object)
return数为多个:返回包含着多个元素的一个元组

为什么要有返回值呢?
因为我们要得到某个函数的执行结果,因为我后面的程序可能会用到这个函数得到的结果,所以要有返回值

4.5 函数的参数

def test(x,y):#x,y为形参
print(x)
print(y)

test(1,2) #1,2叫实参(占用空间)
'''
1)  形参和实参
实参:实际参数,调用函数是传给函数的参数,可以是常量,变量,表达式,函数等传给形参
形参:形式参数,不是实际存在,是虚拟变量,在定义函数和函数体的时候使用形参,目的是在函数调用时接收实参(实参个数,类型与实参一一对应)

区别:形参是虚拟的,不占用内存空间,形参变量只有在被调用时猜分配内存单元,实参是一个
变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参

2) 位置参数和关键字
(标准调用:实参与形参位置一一对应)
(关键字调用:位置无需固定)
#关键字调用
def test(x,y):
print(x)
print(y)

test(y = 2, x = 1) #和上面的结果是一样一样的

#那如果既有位置参数,又有关键字参数调用的话会怎么样呢?
def test(x,y):
print(x)
print(y)

test(2, x = 1) #会报错 TypeError: test() got multiple values for argument 'x',变量x有多个值

在这里一定要注意:关键字参数是不能写在位置参数的前面
3)默认参数:调用函数的时候,默认参数可传进去,也可以不传,如果传入则按传入的参数。例如安装软件的时候,可以默认安装某些东西

#默认参数
def test(x, y=2):
print(x)
print(y)

test(1)#1,2
#当然也可以test(1,2)给它再次传参

4)参数组
*args:把位置参数转变为元组

def test(*args):
print(args)

test(1,2,3,4,5,6)
#test(*[1,2,3,4,5,6])#也可以这样来调用

def test2(x,*args):
print(x)
print(args)

test2(1,2,3,4,5,6) #1
#(2, 3, 4, 5, 6) 返回这两组值

**kwargs: 把关键字参数转化成字典的方式

def test(**kwargs):
print(kwargs)
print(kwargs["name"]) #最终会返回john

test(name='john',age=18,gender="M")
#test(**{name="john",age=18,gender="M"})
#{'name': 'john', 'age': 18, 'gender': 'M'}

def test2(name, age=18, **kwargs):
print(name)
print(age)
print(kwargs)

test2('john',gender="f",like="YOU",age=4) #john
#4
#{'gender': 'f', 'like': 'YOU'}返回这三组结果

5局部变量

在函数体内的变量我们称之为局部变量,反之则为全局变量
在整个程序中都可以访问到的变量,称之为全局变量
当然局部变量也可以变成全局变量,用关键字global来规定就可以了,但是不建议这样用……

#eg1
a = "全局变量"
def test():
a = “局部变量”
print(a)
test() #局部变量
print(a)#全局变量

#eg2
def change_name(name):
print("do not change ",name)
name = "b" #这个函数就是这个变量的作用域,当这个函数运行完后,变量就会被销毁
print("change ",name)
name = "a"
change_name(name)
print(name)

#eg3
name = "john"

1bb8c
def change_name():
name = "JOHN"
print(name)
change_name()#JOHN
print(name)#john

#eg4
names = ["john","jack","vlim"]
def change_names():
names[0] = "JOHN"
print(names)
change_names()#['JOHN', 'jack', 'vlim']
print(names)#['JOHN', 'jack', 'vlim']
#字符串、数字在局部变量中不能修改全局的变量
#但列表、字典、集合都可以在局部变量中来修改全局的变量
#为什么这样设计呢?
因为列表、字典你可能现在用这么多数据就可以了,但是现在我们需要添加其他功能,就需要向列表、字典中添加数据了

6递归

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

6.1 递归的特性

1)必须有一个明确的结束条件
2)每次进入更深一层递归时,问题规模相比上次递归应有所减少
3)递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会多一层帧,每当函数返回,栈就会减少一层栈帧,由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

def calc(n):
print(n)
if int(n/2) == 0:
return n
return calc(int(n/2))

calc(10) #返回的结果是10,5,2,1

附上一个写的特别好的讲解递归的网址,虽然是用java写的,但是思路非常棒
https://blog.csdn.net/sinat_38052999/article/details/73303111#commentBox

7高价函数

变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数就称之为高阶函数

eg1:
def add(x,y,f):
return f(x)+f(y)
res = add(-3,6,abs)
print(res) #9
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: