一 集合的使用
集合是一个无序的,不重复的数据组合
1去重是集合的特点。把一个列表变成集合,就自动去重了。
2关系测试,测试两组数据之前的关系,例如交集、差集、并集关系。
__author__ = 'shellxie'
# -*- coding:utf-8 -*-
scg = [1,2,3,4,5,67,8,7,8]
scg= set(scg)
scg_1 = set([3,4,5,6,7,8,9,0])
print(scg,scg_1,type(scg)) # 集合是无序的
print(scg.intersection(scg_1)) # 取出交集
print(scg.union(scg_1)) # 求并集
print(scg.difference(scg_1)) # 求差集,我有你没有的就是差集,in scg not in scg_1
print(scg_1.difference(scg))
scg_2 =set([2])
print(scg_2.issubset(scg)) # 判断scg_2是不是scg的子集,返回为真
print(scg.issuperset(scg_2)) # 判断scg 是不是scg_2的父集,返回为真
print(scg.symmetric_difference(scg_1)) # 对称差集 ,把重复的去掉,然后合并
print(scg.isdisjoint(scg_1)) # 如果两个集合没有任何交集则返回为真
print(scg & scg_1) # 交集
print(scg | scg_1) # 并集
print(scg - scg_1) # 差集
print(scg ^ scg_1) # 对称差集
scg.add("我的是你") # 添加一项
scg.update(["德玛西亚","无极之道"]) # 添加多项
print(scg)
scg.remove("我的是你") # 删除一项
print(scg)
print(len(scg)) # 集合的长度
if "我的是你" not in scg: # 判断在不在
print("yeah")
print(scg.pop())
print(scg.pop()) # 删除一个任意的元素
print(scg)
print(scg.discard("我的是你")) # 删除一个集合中的元素,如果集合里真的有这个元素则删除,如果集合里没有这个元素,只会返回None。而remove的时候集合里没有这个元素的话,程序会报错。
二 文件操作
文件操作流程
1. 打开文件,得到文件句柄,并赋值给一个变量
2. 通过句柄对文件进行操作
3. 关闭文件
文件操作增删改查
__author__ = 'shellxie'
# -*- coding:utf-8 -*-
# f = open("fivemiles").read()
# print(f)
# f = open("fivemiles") # 文件句柄
# scg =f.read()
# scg1 = f.read()
# print(scg)
# print("-----------scg1-------------",scg1) # 此时打印scg1 的时候 因为已经读过一遍了,内存指针停留在最后,所以再读的时候就是none输出
f =open("fivemiles","r") # r是读模式
f1 =open("fivemiles2","w") # w是写模式,创建一个文件,所以用的时候要慎重一点,会覆盖同名的文件
f1.write("我的剑就是你的剑\n")
f1.write("我的剑就是你的剑\n")
f2 = open("fivemiles2","a") # a是追加模式
f2.write("我的剑就是你的剑3")
#print(f2.read()) # a追加模式同样也不能读
print(f.readline()) # 读内存指针的所在那一行
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
for i in range(5): #用for 循环 来实现想读多少行就读多少行
print(f.readline())
print(f.readlines()) #把每行的东西作为一个元素放进一个列表,此时它是一个列表
print("---",f.readline()) #此时内存指针又到了最后的地方,再打印时已经是none
f3 = open("fivemiles3","r")
for index,line in enumerate(f3.readlines()):
if index ==9:
print("--------索引下标位9是说明已经打印了九行了--------")
continue
print( line.strip() ) # 比较耗费内存,需要把所有的读出来,是低级的循环
print("----------------------------------")
f4 =open("fivemiles4","r",encoding= "utf-8")
count =0
for line in f4:
if count==9:
print("我是分割线--------------------------------------")
count +=1
print(line)
count +=1
print(f4.tell()) # 此时光标在最后一个,所以打印的光标当前 的位置
f4.seek(0) # 将光标移到初始的位置
print(f4.tell())
f4.seek(10)
print(f4.readline()) # 从光标位置开始打印那一行
print(f4.encoding) # 打印编码
print(f4.fileno()) # 内部维护的一个编号
print(f4.name) # 文件名
print(f4.seekable()) # 不是所有的文件都能移动光标的,例如tty文件等等,能移动就返回True
print(f4.readable()) # 判断文件是否可读
print(f4.flush()) # 即时的刷新到硬盘中
import sys,time
for i in range(30):
sys.stdout.write("#") # 导入sys模块和time模块,stdout 是标准输出,标准输出写和即时刷新,0.1秒循环一次
sys.stdout.flush()
time.sleep(0.01)
print(f4.closed) # 判断文件是否关闭
f5 = open("fivemiles5","a",encoding="utf-8")
f5.seek(22)
f5.truncate() # 这个是受seek的影响的,alex在视频里说错了!
f6 = open("fivemiles6","r+") # 以读和追加的模式打开,不管光标在那里都是在文件最后追加
f7 = open("fivemiles7","w+") # 写读的模式打开,不管光标在那里都是在文件最后追加
f8 = open("fivemiles8","a+") # 追加读写
f9 = open("fivemiles9","rb") # 二进制的格式读这个文件
f10 = open("fivemiles10","wb") # 二进制的格式写
f10.write("hello \n".encode())
f11 = open("fivemiles11","ab") # 二进制的格式追加
print(f6.readline())
print(f6.readline())
print(f6.readline())
print(f6.readline())
f6.write("---------------我是分割线")
修改文件
f=open("fivemiles","r")
f_new =open("fivemiles2.bak","w")
str_find ="那就是我"
replace_str = "那就是alex1"
for i in f:
if str_find in i :
i = i.replace(str_find,replace_str) # 修改文件,源文件不动-创建一个新的
f_new.write(i)
f.close()
f_new.close()
with 语句
with open("fivemiles","r") as f,\
open("fivemiles2","r")as f1: # python 官方建议的with 打开多个文件的格式,因为一行最好不要超过80个字符
for line in f:
print(line)
三 字符编码与转码
中文的windows 默认是gb2312的编码
存一个英文字符或一个中文字符,unicode 所有的中文或者是英文都默认是占两个!
ASCII码里所有的英文字符都是占一个字节。ASCII码里是不能存中文的!!!
utf-8是一个可变长的字符编码,所有的英文字符依然是按照ASCII码的形式取存储,所有的中文字符统一是三个字节
unicode 相当于一个大袋子,里面装着GBK、GB2312、还有其他的。
在python3里所有的字符默认都是unicode
在python2里默认的编码格式是ASCII
四 Python函数介绍
1面向对象---华山派--->>>类--->>> class
2面向过程---少林派--->>>过程--->>> def
3函数式编程(最早的)---逍遥派--->>>函数--->>>def
编程语言中函数的定义:函数是逻辑结构化和过程化的一种编程方法。
python 中函数定义方法:
def test(x):
"值“
x+=1
return x
def :定义函数的关键字
test:函数名
():内可定义形参
“” :文档描述,非必要的内容,但是强烈建议添加描述信息,好让自己不要遗忘和别人知道你这里函数表达的意思,例如pycharm源码就描述了这个函数的意思
x+=1 :泛指代码或程序处理逻辑
return:定义返回值
#函数
def func1():
"testing1"
print("in the func1")
return 0
#面向过程 :就是没有返回值的函数
def func2():
"testing2"
print("in the func2")
x=func1()
y=func2()
print(x,y)
#输出结果为:
in the func1
in the func2
0 None
一开始不懂return 0的意思 然后网上找了一下,这个知乎er对 return 解释的很到位,给各位新手也借鉴一下!以下为原文{
(首先要了解,函数是什么?
书上可能会说函数是完成功能的模块之类的话。其实说白了,函数就是个你招来的工人。
你给他一些材料,告诉他怎么用这些材料拼装,然后他负责把拼装好的成品交给你。材料就是函数的参数,成品是函数的输出,而怎么拼装就是你写的函数体代码了。
比如这段代码
def worker(a, b, c):
x = a + b
y = x * c
这个工人(worker)在你的指导下,用a b c三个材料,装配出了x和y两个成品。
但是程序里的装配和工厂不同,用过的材料不会消失。这样,这个工人手里就有了a b c x y五样物品。他怎么知道你要的是哪个呢?
所以return的作用就是,在这种时候告诉工人你到底想要什么东西,是一个iPhone手机壳还是整台iPhone。例如
def worker(a, b, c):
x = a + b
y = x * c
return y
这样工人就会把y交给你。当你让这个工人帮你干活(调用函数的时候)
result = worker(1, 2, 3)
你就会得到对应的结果((1+2)*3)。
这就是return的作用。
作者:sqybi
def test():
print("in the test")
def test1():
print("in the test")
return 0
def test2():
print("in the test")
return 1,"ss",[1,2],{3:1,4:2}
test()
test1()
test2()
x=test()
y=test1()
z=test2()
print(x)
print(y)
print(z)
调用函数举例
__author__ = 'shellxie'
# -*- coding:utf-8 -*-
import time
def shopping():
"""this is shopping list"""
time_format = "%Y-%m-%d %X"
time_current = time.strftime(time_format)
with open("a.txt","a+") as f:
f.write("%s end action"% time_current)
product_list =[
("森海塞尔耳机",3880),
("高配大屏台式机",16880),
("捷安特自行车",3880),
("大床",6680),
("拿铁",38),
("苹果7p",5880)
]
salary = input("input your salary:")
shopping_list=[]
if salary.isdigit():
salary =int(salary)
while True:
for index,item in enumerate(product_list):
print(index,item)
choice= input("input the code that you wanna buy:")
if choice.isdigit():
choice=int(choice)
if choice<len(product_list) and choice>=0:
p_item =product_list[choice]
if p_item[1]<= salary:
shopping_list.append(p_item)
salary -=p_item[1]
print("add %s into you shopping list,and your 余额 is \033[40;1m %s \033[0m"%(p_item,salary))
else:
print("your 余额 is \033[40;1m not enough \033[0m to buy,please 跟我学python吧")
else:
print("correct number please")
elif choice == "q":
print("------SHOPPING CART------")
for p in shopping_list:
print(p)
print("你的余额还剩 \033[41;1m %s \033[0m"%salary)
exit()
else:
print("Only \033[40;1m Number \033[0m Please") #42代表背景绿 41代表背景红 40 代表背景黑色
else:
print("\033[42;1m ONLY NUMBERS PLEASE\033[0m")
def test():
print("购物车")
shopping()
test()
函数参数
def test(x,y): # x和y是形参
print(x)
print(y)
test(1,2) # 1和2 是实参
test(x=1,y=2) # 关键字参数调用,与形参顺序无关
test(1,2) # 位置参数调用,与形参一一对应
test(2,y=3) # 关键参数不能写在位置参数前面
默认参数
def test(x,y=2): # 默认参数的特点:调用函数的时候,默认参数非必需传递的。也就是说形参如果有值了,在实参里面你不写,是可以的,函数调用的时候就直接用默认的形参!
print(x) # 用途是 1.默认安装值 2.
print(y)
test(1)
test(1,3) # 但是如果实参写了,调用函数的是会以实参为准
*agrs 和 **args 的应用
#args 只能接收n个位置参数,然后转化成元组的形式
def test(*args):
print(args)
test(1,2,3,4,56,7,6)
test(*[1,2,3,4,5,6,7])
test(*[1,2,3,4,5,6]) # args = tuple ([1,2,3,4,5])
print("------------")
def test1(x,*args): # *args 会把多传入的参数变成一个元组形式
print(x)
print(*args)
test1(1,2,3,4,5,6,7)
# **kwargs 只能把n个关键字参数,转换成字典的方式,一定要是关键字参数
def test(**kwargs): # **代表接收字典
print(kwargs)
print(kwargs["name"])
print(kwargs["age"])
test(name="alex",age=22,sex= "f") # 把关键字参数按照字典的方式存放起来
test(**{"name":"alex","age":8})
def test (name,age,*args,**kwargs): # 输出结果
print(name,age,args,kwargs) # Alex 22 () {}
test("alex",32) # 后面这个{}就是kwargs,只是因为没传值,所以为空
test("alex",32,"cn","python",sex="male",province= "anhui")
作用域、局部与全局变量
school = "SCG" # 全局变量 ,能用在这里的任何地方
def change_name(name):
global school # 在函数里把局部变量修改成全局变量
school = "ShiDao"
print("before chagne ",name,school)
name = "SHELL" # 这里的name 就是局部变量,而这个函数就是这个变量的作用域
print("after chagne",name)
print(school) # 这里的打印scholl 是函数没调用之前
name = "alex"
change_name(name)
print(name)
print(school) # 这里打印的school 是把函数里的局部变量改成了全局变量之后
递归
在函数内部可以调用其他函数。如果调用自己本身,这个函数就是递归函数。
1 递归必须有一个明确的结束条件
2 每次进入更深一层的递归是,问题的规模比上次递归的都应该有所减少
3 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
def alex(n):
print(n)
if int(n/2) >0 :
return alex(int(n/2)) # int的功能是把他转化成整数
print(">>>>>",n)
alex(10)
函数式编程介绍
数学里面的函数,输入是确定的,输出是一定确定的。但是在我们python函数里面。输入是确定的,而输出是不一定确定的
例如
#f(x,y) , z= 3x+2y #这个是数学里面的二元函数,如果输入是固定的,输出也就是固定的
def scg(x,y) : # 因为存在逻辑运算,所以输出不是固定的
if x +y > 9:
return 0
scg(2,6)
print(scg(2,6))
函数是编程语言去学 lisp,hashshell,erlang
高阶函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就可以称为高阶函数。
def add(a,b,f): # 高阶函数,abs 是一个求绝对值的内部自定义函数
return f(a) + f(b)
print( add(3,-6,abs)
)