一、集和

  集合是一个无序的,不重复的数据组合,它的主要作用如下:

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

1.创建集合

>>> s = set([3,5,9,10])     #创建一个数值集合
>>> t = set("Hello") #创建一个唯一字符的集合
>>> s
{9, 10, 3, 5}
>>> t
{'e', 'H', 'l', 'o'} #集和自动去重
>>> type(s),type(t)
(<class 'set'>, <class 'set'>) #集和类型
>>> len(s) #集和长度
4
>>> s==t
False
>>> s1=s
>>> s1
{9, 10, 3, 5}
>>> s1==s
True

2.访问集和

由于集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用in、not in来访问或判断集合元素。

>>> t
{'e', 'H', 'l', 'o'}
>>> "e" in t
True
>>> "a" in t
False
>>> "a " not in t
True
>>> for i in t: print(i) e
H
l
o

3.更新集和

可使用以下内建方法来更新:

s.add()
s.update()
s.remove()

注意只有可变集合(set创建的集和,frozense创建的集和是不可变集和)才能更新:

>>> s
{9, 10, 3, 5}
>>> t
{'e', 'H', 'l', 'o'}
>>> s.add(1) #添加一个元素
>>> s
{9, 10, 3, 5, 1}
>>> s.update([0,2,4]) #添加多个元素
>>> s
{0, 1, 2, 3, 4, 5, 9, 10}
>>> t.add('python')
>>> t
{'e', 'H', 'l', 'python', 'o'}
>>> t.update('python') #添加一个字符会拆成多个
>>> t
{'e', 'y', 'n', 'h', 't', 'p', 'o', 'python', 'H', 'l'}
>>> t.remove('python') #删除一个元素
>>> t
{'e', 'y', 'n', 'h', 't', 'p', 'o', 'H', 'l'}

4.集和关系操作

x in s
测试 x 是否是 s 的成员 x not in s
测试 x 是否不是 s 的成员 s.issubset(t)
s <= t
测试是否 s 中的每一个元素都在 t 中 s.issuperset(t)
s >= t
测试是否 t 中的每一个元素都在 s 中 s.union(t)
s | t # t 和 s的并集
返回一个新的 set 包含 s 和 t 中的每一个元素 s.intersection(t)
s & t # t 和 s的交集
返回一个新的 set 包含 s 和 t 中的公共元素 s.difference(t)
s - t # 求差集(项在s中,但不在t中)
返回一个新的 set 包含 s 中有但是 t 中没有的元素 s.symmetric_difference(t)
s ^ t # 对称差集(项在t或s中,但不会同时出现在二者中)
返回一个新的 set 包含 s 和 t 中不重复的元素 s.copy()
返回 set “s”的一个浅复制

del:删除集和本身,如“del t”

>>> s and t    #取t
{'e', 'y', 'n', 'h', 't', 'p', 'o', 'H', 'l'}
>>> s or t #取s
{0, 1, 2, 3, 4, 5, 6, 9, 10}
>>> type(s)
<class 'set'>
>>> list(s) #转化为列表模式
[0, 1, 2, 3, 4, 5, 6, 9, 10]
>>> str(s) #转化为字符串模式
'{0, 1, 2, 3, 4, 5, 6, 9, 10}'
>>> type(str(s))
<class 'str'>
>>> tuple(s) #转化为元组
(0, 1, 2, 3, 4, 5, 6, 9, 10)

二、文件操作

打开文件的模式:

  • r, 只读模式【默认】
  • w,只写模式【不可读;不存在则创建;存在则删除内容;】
  • a, 追加模式【不可读;不存在则创建;存在则只追加内容;】

"+" 同时读写某个文件:

  • r+,可读写文件。【可读;可追加】
  • w+,写读
  • a+,追加读

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

  • rU
  • r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

  • rb
  • wb
  • ab
 我越无所适从
越会事与愿违
在交错的时空
灵魂加速下坠
Here we are, here we are, here we are

默认操作文件

1.read()、readline()、readlines()的区别

f=open("haproxy.txt",encoding="utf-8")    #默认读取模式
print(f) #不加参数,直接打印
'''
<_io.TextIOWrapper name='haproxy.txt' mode='r' encoding='utf-8'>
'''
print(f.read()) #read参数,读取文件所有内容
'''
我越无所适从
越会事与愿违
在交错的时空
灵魂加速下坠
Here we are, here we are, here we are
'''
print(f.readline()) #readline,只读取文章中的一行内容
'''我越无所适从''' print(f.readlines()) #readlines,把文章内容以换行符分割,并生成list格式,数据量大的话不建议使用
#['我越无所适从\n', '越会事与愿违\n', '在交错的时空\n', '灵魂加速下坠\n', 'Here we are, here we are, here we are\n']
f.close()  #关闭文件
 
f= open("har.txt",encoding="utf-8")

for index,line in enumerate(f.readlines()):    #先把文件内容以行为分割生成列表,数据量大不能用
if index == 3:
print("-----我是分割线-------")
continue
print(line.strip()) count = 0
for line in f: #建议使用方法,每读取一行,内存会把之前的空间清空,不会占用太多内存,强推!!!
count +=1
if count == 4:
print("-----我是分割线-------")
continue
print(line.strip()) #我越无所适从
#越会事与愿违
#在交错的时空
#-----我是分割线-------
#Here we are, here we are, here we are

2、seek、tell光标

f= open("har.txt",encoding="utf-8")     #文件句柄
data = f.read() #默认光标在起始位置,.read()读取完后,光标停留到文件末尾
data2 = f.read() #data2读取到的内容为空
print(data)
print("--------",data2)
f.close() #关闭文件
#我越无所适从
#越会事与愿违
#在交错的时空
#灵魂加速下坠
#Here we are, here we are, here we are
#-------- #用seek移动光标位置
f= open("har.txt",encoding="utf-8")
print(f.tell()) #tell 获取当前的光标位
print(f.readline().strip())
print(f.readline().strip())
print(f.readline().strip())
print(f.tell())
f.seek(0) #seek 移动光标到文件首部
print(f.readline().strip()) #从文件首部开始打印
f.close() #关闭文件
#
#我越无所适从
#越会事与愿违
#在交错的时空
#
#我越无所适从

3.模拟进度条

import sys,time    #加载模块

for i in range(20):
sys.stdout.write("》")
sys.stdout.flush() #flush 强制刷新缓存到内存的数据写入硬盘
time.sleep(0.5)
#如果不用flush刷新会等全部》写如内存之后再写入硬盘,效果就是一次出来20个》,用的话就像进度读条一样了,不信试试看。

三、字符编码与转码

#同志们注意了上图非常牛b
import sys
print(sys.getdefaultencoding()) #显示字符编码
a_unicode="夫风起于青萍之末" #这个是unicode格式
print(a_unicode)
a_gbk=a_unicode.encode('gbk') #默认是unicode格式,转化为gbk格式
print(a_gbk)
a_gb2312=a_gbk.decode('gbk').encode('gb2312') #先decode转化为unicode格式,括号里告诉自己是gbk格式的,再encode转化,括号里写要转化的格式。
print(a_gb2312) #gbk是gb2312升级版,常用汉字的编码基本相同
a_unicode2=a_gbk.decode('gbk') #转化为unicode格式
print(a_unicode2)
'''
#执行结果在这里:
utf-8
夫风起于青萍之末
b'\xb7\xf2\xb7\xe7\xc6\xf0\xd3\xda\xc7\xe0\xc6\xbc\xd6\xae\xc4\xa9'
b'\xb7\xf2\xb7\xe7\xc6\xf0\xd3\xda\xc7\xe0\xc6\xbc\xd6\xae\xc4\xa9'
夫风起于青萍之末
'''

四、函数

终于到函数了。。。下面是多方总结:

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

特性:

  1. 减少重复代码
  2. 使程序变的可扩展
  3. 使程序变得易维护

1.函数定义

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None
def sayhi():#函数名
print("Hello, I'm nobody!") sayhi() #调用函数
#下面这段代码
a,b = 5,8
c = a**b
print(c) #改成用函数写
def calc(x,y):
res = x**y
return res #返回函数执行结果 c = calc(a,b) #结果赋值给c变量
print(c)

2.函数参数

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。

实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。

3.默认参数

def printinfo( name, age = 18 ):    #有默认参数时,如果age不传参就用默认的值。正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。
print ("名字: ", name);
print ("年龄: ", age);
return; #调用printinfo函数
printinfo( age=23, name="cheng" );
print ("------------------------")
printinfo( name="cheng" ); '''
名字: cheng
年龄: 23
------------------------
名字: cheng
年龄: 18
'''

4.非固定参数

若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数。

def stu_register(name,age,*args): # *args 会把多传入的参数变成一个元组形式
print(name,age,args) stu_register("Alex",22)
#输出
#Alex 22 () #后面这个()就是args,只是因为没传值,所以为空 stu_register("Jack",32,"CN","Python")
#输出
# Jack 32 ('CN', 'Python')
def stu_register(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式
print(name,age,args,kwargs) stu_register("Alex",22)
#输出
#Alex 22 () {}#后面这个{}就是kwargs,只是因为没传值,所以为空 stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")
#输出
# Jack 32 ('CN', 'Python') {'province': 'ShanDong', 'sex': 'Male'}

5.局部变量

局部变量只在他的作用域内其起作用,也可以声明为全局变量,不过因为写代码长的时候随便声明可能会乱,所以不推荐。

def change_name(name):
print("before change:",name)
name = "里面的局部变量"
print("after change:", name)
name=('外面的全局变量')
change_name(name)
print("在外面看看name改了么?",name)
'''
before change: 外面的变量
after change 里面的变量
在外面看看name改了么? 外面的变量
'''

6.返回值

要想获取函数的执行结果,就可以用return语句把结果返回。

注意:

  1. 函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束。
  2. 如果未在函数中指定return,那这个函数的返回值为None。

7.递归

def calc(n):
print(n)
if int(n/2) ==0:
return n
return calc(int(n/2)) calc(10) 输出:
10
5
2
1

递归特性:

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

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

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

 import random
shopping_list = []
shop_list = []
add = []
p = []
condition = True
identity_input = input(
"1. 用户\n"
"2. 商家\n"
"请选择对应身份序号[1|2]:")
if str.isdigit(identity_input):
identity_input = int(identity_input)
if identity_input == 1:
money_input = input("欢迎用户访问,输入购物金额:")
if money_input.isdigit():
money_input = int(money_input)
with open("shoplist.txt", encoding='utf-8') as file:
for list in file:
shop_list.append((list.strip().split()[0], list.strip().split()[1]))
while condition:
for index, i in enumerate(shop_list):
print((index+1), i)
choice = input("请输入选择的商品序号,选择完毕q退出:")
if choice.isdigit():
choice = int(choice)
if choice <= len(shop_list) and choice >= 0:
p = shop_list[choice-1]
a = int(p[1])
if a <= money_input: #买的起
shopping_list.append(p)
money_input -= a
print("增加了%s商品,你的钱剩余%s" % (p, money_input))
else:
print("余额不足,请重新选择,按q退出")
else:
print ("商品%s不存在" % choice)
elif choice == 'q':
print("--------已购商品列表--------")
for w in shopping_list:
print(w)
print("余额为%s" % money_input)
exit()
elif identity_input == 2:
print("欢迎商家访问:")
with open("shoplist.txt", encoding='utf-8') as file:
for list in file:
shop_list.append((list.strip().split()[0], list.strip().split()[1]))
while True:
for index, i in enumerate(shop_list):
print((index+1), i)
business_input = input(
"1.删除\n"
"2.添加\n"
"按q退出\n"
"请选择删除还是添加1|2:")
if str.isdigit(business_input):
business_input = int(business_input)
if business_input == 1:
business_choice = int(input("请输入要删除的商品序号:"))
del shop_list[business_choice-1]
c = 0
with open('shoplist.txt', 'w', encoding='utf-8') as d:
while c < len(shop_list):
d.write(shop_list[c][0])
d.write(' ')
d.write(shop_list[c][1])
d.write('\n')
c += 1
elif business_input == 2:
business_choice1 = input("请输入要添加的商品名称:")
business_choice2 = input("请输入要添加的商品价格:")
add.append(business_choice1)
add.append(business_choice2)
shop_list.append(add[-2:])
with open('shoplist.txt', 'a', encoding='utf-8') as f:
f.write(business_choice1)
f.write(' ')
f.write(business_choice2)
f.write('\n')
else:
print("请输入正确的序号!!!!!!!!!!!!!!!!!!!!!!")
elif business_input == 'q':
print("正在退出。。。 。。。")
exit()
else:
print("身份输入错误,程序退出。。。 。。。")
else:
print("输入错误,没有输入的身份序号。")

购物车程序

矿泉水 10
可乐 20
咖啡 30
橙汁 40

程序需要文件,命名shoplist.txt

诸君共勉:

  那些没有消灭你的东西,会使你变得更强壮。——弗里德里希·威廉·尼采

Python-Day3 Python基础进阶之集和/文件读写/函数的更多相关文章

  1. Python自动化--语言基础4--模块、文件读写、异常

    模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...

  2. python自动化--语言基础四模块、文件读写、异常

    模块1.什么是模块?可以理解为一个py文件其实就是一个模块.比如xiami.py就是一个模块,想引入使用就在代码里写import xiami即可2.模块首先从当前目录查询,如果没有再按path顺序逐一 ...

  3. Python笔记之 - 一张截图诠释"文件读写" !

    Python笔记之 - 一张截图诠释"文件读写" ! 源代码如下: # 文件读写 str_test1 = "先创建txt文件再写入内容: 我是大帅哥" # wi ...

  4. python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)

    面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...

  5. Python学习(九)IO 编程 —— 文件读写

    Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...

  6. Python:pandas(一)——常用、读写函数read_csv、read_excel、to_csv、to_excel

    学习自:pandas1.2.1documentation 0.常用 1)读写 ①从不同文本文件中读取数据的函数,都是read_xxx的形式:写函数则是to_xxx: ②对前n行感兴趣,或者用于检查读进 ...

  7. (转载)C++文件读写函数之——fopen、fread和fwrite、fgetc和fputc、fgets和fputs、ftellf和fseek、rewind

    http://blog.sina.com.cn/s/blog_61437b3b0102v0bt.html http://blog.csdn.net/chenwk891/article/details/ ...

  8. C文件读写函数介绍(转)

    1.fopen() fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen实现三个功能:为使用而打开一个流,把一个文件和此 ...

  9. 封装 INI 文件读写函数

    delphi读写ini文件实例 //--两个过程,主要实现:窗体关闭的时候,文件保存界面信息:窗体创建的时候,程序读取文件文件保存的信息. //--首先要uses IniFiles(单元) //--窗 ...

随机推荐

  1. [ASP.Net]TableLayoutPanel的使用

    以前都是使用Panel.没有用过其他容器类.郁闷,要控制界面的自适应真是麻烦.平常用一用dock.anchor差不多了,但是,更复杂的情景下,就没法了.例如一行有多个控件,有的要求跟据窗口缩放,只缩放 ...

  2. Android(java)学习笔记61:多线程程序的引入

  3. js中的命名规范

    在实际开发中规范的命名,不仅方便自己查看,理解变量的实际意义,而且在团队开发中也能提高开发效率. 下面将介绍javascript中的变量的命名规范: 1)首先,变量名要有实际意义,不建议使用单个的字母 ...

  4. 干货:VLDB论文摘要-阿里技术突破性创新

    阿里技术突破性创新 世界顶级大规模数据处理分析管理会议VLDB(VERY LARGE DATA BASE)于9月1日至5日在杭州举办,该会议也是也是大数据云计算领域的盛会,阿里巴巴两个团队在这个会议上 ...

  5. 【开源项目5】测滑菜单MenuDrawer的使用以及解析

    在安卓中左右侧滑菜单的使用用的比ios多得多,可能是谷歌带的头吧,几乎所有的谷歌应用都有侧滑菜单.谷歌没有开放这个源码,在一个成熟的开源代码出现之前,大家都是各自为战,偶尔能看到一个勉强实现了的.Me ...

  6. request.getHeader("Referer")理解【转载】

    request.getHeader("Referer")用于获取来源页地址,但有时却为空值,这是怎么回事.原因如下: getHeader("Referer")要 ...

  7. 深入理解HTTPS通讯原理

    一.HTTPS简介 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),简单来讲就是加了安全的HTTP,即HTTP+SSL:我们知 ...

  8. vs克隆新建团队项目

    团队资源——克隆,完成后打开: 在解决方案资源中,添加——新建项目——web——ASP.NET web应用程序——空的,并将其设为启动项目:

  9. PHP中正则替换函数preg_replace用法笔记

    今天应老板的需求,需要将不是我们的页面修改一个链接,用js+iframe应该也能实现,但是我想尝试一下php实现方法. 首先你得先把别人的页面download到你的php中,实现方法可以用curl, ...

  10. Table of Contents - ActiveMQ

    Getting Started ActiveMQ 的安装 Hello World Configuring Standard ActiveMQ Components Connecting to Acti ...