Python Learning, Day2

1. 列表(list)、元组(tuple)

1.1 基本操作

列表和matlab中的向量很类似。小心2点即可:

  • 取值:顾头不顾尾,前闭后开
  • 下标:位置从0开始,最后开始为-1
names = ["Zhu Yijun", "Xiao Ming", "Xiao Ming", "Da Bing", "Xi Ha"]

#取(切片法)
print(names[1:3])  #取1和2;区间:[),顾头不顾尾
print(names[-1])   #直接取最后一个
print(names[-3:])  #取最后3个
print(names[::2])  #步长为2(0、-1可以省略)

#
names.append("Lei Haidong")#默认放最后
names.insert(1,"Lei Haidong")#插在第2个

#
#names[2] = "Xie Di"

#
names.remove("Lei Haidong")
del names[2]

#
print(names.index("Da Bing"))

#统计个数
print(names.count("Xiao Ming"))

#排序
names.sort()
print(names)

#合并
names2 = [1, 2, 3, 4]
names.extend(names2)
print(names)

#循环
for i in names:
    print(i)

 

1.2 列表copy

3种copy的方式,从内存地址理解可以明白

  • 直接赋值:内存完全一样,很少用
#直接赋值
p1 = person

 

  • 浅copy:由于引用的关系,仅第一层元素的内存不一样
#浅copy的定义

#法1
p1 = person[:]

#法2
import copy
p2 = copy.copy(person)    #需要导入copy模块
#理解浅copy的应用,共用财产,统一变
import copy
person = ['name', ['work', 100]]

p1 = person[:]
p2 = copy.copy(person)

p1[0] = 'Zhu Yijun'
p2[0] = 'Amy'

p1[1][1] = 50   #会发现,p2也变了

print(p1)
print(p2)

 

  • 深copy:所有元素的内存都不一样,完全独立
import copy
names3 = copy.deepcopy(names)

 

1.3 购物车程序收获

 把在购物车程序中的一些小收获总结如下:

#列表很多时,别写一行,这样多清晰
list_product = [
    ('Ipad Mini', 4000),          #这样写看起来多舒服
    ('Coffee', 30),
    ('Car', 12000),
    ('Book', 80),
    ('Tea', 30),
]

 

#输入的字符经判断后再强转,用.isdigit
salary = input('Please input your money:')
if salary.isdigit():  #如果字符串salary只包含数字则返回 True 否则返回 False。
    salary = int(salary)

 

#打印带序号的列表
for item in list_product:
     print(list_product.index(item),item)   #列表.index:查找位置
for index,item in enumerate(list_product):  #enumerate多用于在for循环中得到计数,利用它可以同时获得索引和值,即需要index和value值
     print(index,item)

 

#在中间输出时,变量前加%号
print("把%s加入购物车,您还剩%s元" %(p_item, salary))
print("余额不足,还剩%s元" %salary)

#彩色输出
#格式:前后加“\033[41;1m     \033[0m”即可         31红,32绿,41背景红,42背景绿
print("\033[41;1m余额不足,还剩%s元\033[0m" %salary)

 

 

#购物车程序逻辑
while True:
    打印列表
    if 输入为序号:
        判断序号,判断余额,加入购物车,打印提示信息
    elif 输入为q:
        打印清单并退出
    else: 
        输入错误

 

 1.4 元组(tuple)

  • 元组和列表几乎一模一样,只不过不能【增删改】而已,只能【查】。又被称为“只读列表”
  • 元组不用[],而用()
  • 它只有2个方法,一个是count,一个是index
  • 什么时候用:创建一组不被改的数据
names = ("alex", "jack")

 

 

2. 字符串操作(string)

字符串不能【增删改】,修改的话是生成一个新的数据。而列表是在原来的内存基础上就修改了。

#字符串常用操作
name = "my \tname is {name} and I am {year} old"

#统计字符个数
print(name.count("m"))   
#打印50个字符,不够-补上。(很美观)
print(name.center(50,"-"))   
#查找
print(name.find("y"))  
#字符串也能切片
print(name[name.find("name"):])   
#字符串格式化
print(name.format(name = 'alex', year = 23)) 
#字典-字符串格式化
print(name.format_map({'name':'alex','year':12}))  

#连接
print('+'.join(['1','2','3']))
#去掉两头空格、回车
print('   Zhu Yijun\n'.strip())   
#提取出数字
print('1+2+3+4'.split('+'))   

 

3. 字典操作(dict)

3.1 字典常用操作

列表的索引是位置,字典的索引是key

  • 字典是无序的,没有下标,也不需要下标,有key
  • key必须唯一,尽量别写中文

 

#字典常用操作

#字典循环打印
for i in info:
    print(i,info[i]) #通过索引循环

#字典定义
info = {
    'stu1101': "TengLan Wu", #是冒号!
    'stu1102': "LongZe Luola",
    'stu1103': "XiaoZe Maliya",
}


#
info["stu1104"] = "Alex"
#
info.pop("stu1103")  #标准删
del info["stu1102"]
#
info["stu1101"] = "武藤兰"
#
print(info.get("stu1104"))
#
print('stu1104' in info)

 

 

#字典中一些别的操作
info = {
    'stu1101': "TengLan Wu",
    'stu1102': "LongZe Luola",
    'stu1103': "XiaoZe Maliya",
}
b = {
    'stu1101':"Alex",
    1:3,
    2:5
}
#合并字典,交叉的覆盖,没有交叉的创建
info.update(b)
print(info)
# 字典转为列表
print(info.items())
#能取到就返回,取不到就创一个新的
info.setdefault("stu1106","Alex")
print(info)

 

3.2 三级菜单程序收获

太复杂了,以后改用函数写,嵌套循环太多。或者好好理解文艺版。

#判断元素是否在字典里
if choice1 in data
if choice2 in data[choice1]

 

 

4. 集合(set)

集合操作主要有2个用途:去重、关系测试(交叉并集)

#集合定义
s1 = set([3,5,9,10])
t = set("Hello")

 

#集合操作(关系测试)
list_1 = set([1,4,5,7,3,6,7,9])
list_2 = set([2,6,0,66,22,8,4])

#返回共有值(交集)
print(list_1.intersection(list_2))  #法1:常规
print(list_1 & list_2)  #法2:更简洁

 

 

 

5. 文件操作

 5.1 文件基本操作

#文件基本操作

#给打开的内存对象赋一个变量
#windows默认编码格式:gbk;而python是utf-8,因此得指定一个编码集
f = open("yesterday", 'r', encoding="utf-8",) #文件句柄(文件名、字符集、内存位置)


#单行读:仅读一行
first_line = f.readline()
#全部读:读取文本剩余所有内容
data = f.read() #文件大时不要用!!!


#写文本
f.write("\n我爱北京天安门。。。。。\n")

#关闭文本
f.close()

#打印分割线
print('我是分割线'.center(50,'-'))

 

#通过循环,打印除10行以外的内容(高效循环法)
count = 0   #计数器
for line in f:   #不用readlines变列表(占内存),而是读一行,删一行,内存里面只存一行
    if count == 9:
        print('我是分割线'.center(50, '-'))
        count += 1
        continue
    else:
        print(line.strip())     #.strip:去掉空格、回车
        count += 1

5.2 其他一些操作

#其他一些小操作

#记录光标位置(前面字符个数,而不是行数)
print(f.tell()) 

#光标回到最开始位置
f.seek(0)

#查看文件编码形式
print(f.encoding) 

#实时写入硬盘
import sys,time
for i in range(20):
    sys.stdout.write("#")
    sys.stdout.flush( )    #f.flush()  #实时写入硬盘,而不是临时存在缓存,防止停电等
    time.sleep(0.1)

 

#读写(r+):打开,读取,追加
f = open("yesterday1", 'r+', encoding="utf-8")  

#二进制读:用于——1网络传输(fgp);2二进制文件(视频)
f = open("yesterday1", 'rb')  

 

5.3 文件修改

修改只能在原来基础上覆盖,因此只有两个办法:(硬盘上不能往后挤)

  • 把文件加到内存里,在内存里修改,再写回硬盘(类似VIM)(2个G的话没法玩儿)
  • 打开,修改完以后,写到一个新文件里面

 

#文件内容修改(替换)
find_str = "肆意的快乐等我享受"
replace_str = "肆意的快乐等Zhu享受"
f = open("yesterday", "r", encoding="utf-8")
f_new = open("yesterday1", "w", encoding="utf-8")

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()

 

6. 字符编码与转码

 

  • ASCII码:1字节,只能英文、特殊字符。不能存中文(python2.0)
  • GBK:2字节,专门用来汉字(txt文件)
  • unicode:2字节,统一了中文、英文(python3.0)
  •               utf-8:万国吗,在unicode基础上,可变长度(默认:英文ascii—1个字节,中文—3                           个字节)

在日本电脑上正常显示中文:gbk→unicode

在中国电脑上正常显示日文:日文→unicode→gbk

会发现,unicode是转换的桥梁

python2.0和python3.0有区别,一个是ascii,一个是unicode

 

转载于:https://www.cnblogs.com/zhuyijunn/p/9830872.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值