“”“
做衔接:
定义谁是谁的属性
这里的实现模拟是”手“上有”牌“
...的...;....'s....设定为属性
方法跟着类走,哪个行为是属于哪个类的行为
"""
小明交换牌
分析需要哪些类:
方案1:人、 牌 人、手、牌
方案1:
人:名字属性,左手牌、右手牌 抓牌、交换牌、展示牌
牌:数值、花色
方案2:
人:名字,左手,右手 交换牌、展示牌
手:扑克 抓拍
牌:对象属性:数值、花色
"""
from random import randint, choice
class Poker(object): 定义扑克牌类
poker_num = ('A','2','3','4','5','6','7','8','9','10','J','Q','K') 属性可以保存值,列表、元组、字典
poker_color = ('♥','♠','♣','♦')
def __init__(self, num='', color=''): 定义类属性
self.num = num
self.color = color
class Hand(object): 定义手类
def __init__(self, poker=None):
self.poker = poker
def get_poker(self): 拿牌
# 随机的从一个容器中取出一个元素
poker.num = choice(Poker.poker_num)
poker.color = choice(Poker.poker_color)
poker = Poker()
self.poker = poker
class Person(object):
def __init__(self, name='', left_hand=None, right_hand=None):
self.name = name
self.left_hand = left_hand
self.right_hand = right_hand
def change_poker(self):
self.left_hand.poker, self.right_hand.poker = self.right_hand.poker, self.left_hand.poker
def show_poker(self):
print('左手牌:%s%s' % (self.left_hand.poker.color, self.left_hand.poker.num))
print('右手牌:%s%s' % (self.right_hand.poker.color, self.right_hand.poker.num))
# 先有小明这个人
p1 = Person('小明')
# 让小明有左手和右手
p1.left_hand = Hand()
p1.right_hand = Hand()
# 抓牌
p1.left_hand.get_poker()
p1.right_hand.get_poker()
# 看牌
print('=======交换前==========')
p1.show_poker()
# 交换牌
p1.change_poker()
# 看牌
print('=======交换后==========')
p1.show_poker()
# a = 10
# b = 20
# a, b = b, a
""" 文件: 每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。 可以编写这样一个程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示 这些内容。 要使用文本文件中的信息,首先需要将信息读取到内存中。 """ with open('foo') as file_object: contens = file_object.read() print(contens) print('--------') # 使用rstrip()方法去文件换行的空格 # 相对路径:后面加/ -- 正斜杠 # 原始字符串:前面加r """ 绝对路径通常更长,建议放在变量中 就目前而言,最简单的做法是,要么将数据文件存储在程序所在的目录,要么将其存储在程序文件所在目录下的一个文件夹中。 """ """ 要以任何方式使用文件--哪怕仅仅是打印其内容,都得先打开文件,这样才能访问它。 """ """ 使用for循环逐行读取文件: """ file_name = 'foo' with open(file_name) as file_object: for line in file_object: print(line.rstrip()) #有两个\n 一个来自print(),一个来自文件 print('22222222222222222222222') """ 存储在列表中: readlines()从文件中读取每一行,并将其存储在一个列表中。 在with代码块外,我们依然可以使用这个变量 """ file_name = 'foo' with open(file_name) as file_object: lines = file_object.readlines() # readlines()方法返回的是一个列表,方便操作 print(lines) for line in lines: print(line.rstrip()) """ 将文件读取到内存中后,就可以以任何方式使用这些数据了 """ """ 创建一个字符串,它包含文件中存储的所有数字,且没有任何空格: """ file_name = 'foo' with open(file_name) as file_object: ines = file_object.readlines() pi_string = '' for line in lines: pi_string += line.strip() #字符串去空格拼接 print('--------------') print(pi_string) print(len(pi_string)) # strip()方法去所有空格 """ 读取文本文件时,Python将其中的所有文本都解读为字符串。如果读取的是数字,并要将其作为数值使用,就必须使用函数 int()将其转换为整数,或使用函数float()将其转换为浮点数。 """ """ 对于可处理的数据量,Python没有任何限制,只要系统的内存足够多,想处理多少数据都可以。 """ """ 检查文件中是否包括某字符串,可用in 成员运算符来检查 """ """ 写入文件: 保存数据最简单的方式之一是将其写入到文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出 也依然存在:可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来讲这些输出读取到内存 中并进行处理。 """ """ 写入文件: 调用open()时提供两个实参,可指定读取模式('r'),写入模式('w'),附加模式('a')或能够读取和写入文件的模式('r+') 如果省略了模式实参,Python将以默认的只读模式打开文件。 以写入('w')模式打开文件时要小心,因为如果文件已存在,Python将清空之前的文件,这个程序没有终端输出 """ file_name = 'foo' with open(file_name,'w') as file_object: file_object.write('I love u.') """ 相比计算机中的其他文件,这个文件没有任何不同,可以打开、在其中输入新文本、复制内容、将内容粘贴到其中。 """ """ Python只能将字符串写入文本文件,要将数值数据存储到文本文件中,必须先使用str()将其转换为字符串格式。 """ """ 写入多行: 函数write()不会自动添加换行符 写入文本时记得添加'\n'换行符 还可以使用空格、制表符、空行来设置写入格式 """ """ 附加到文件: 'a',写入到文件的行都将添加到文件末尾,如果指定文件不存在,Python将创建一个新文件。 也使用write()方法 """ """ 匹配0-255,0,10,100,220 """ pattern = '^(\d|[1-9]\d|1\d\d|2[0-5][0-5])$' import re print(re.search(pattern,'22')) """ 加上$符就以结尾处短路,即不再存在短路 """ """ 异常: try:中方可能会发生异常的语句, except:里放Python的错误类型 else:如果没有发生异常,程序继续执行 """ """ 异常: 尝试:输入用户名: 正则:用户名:huixineier2 Whang2isne 密码:jaisjnv jaisdn232 Wioan38902 '\w+' """ print('-----------------------------') # import re # regex_name ='\w+' # regex_password = '\w+' # # my_name = 'Wangyifei' # my_password = 'kgc503' # # user_name = input("请输入用户名: ") # password = input('请输入密码: ') # # try: # # re.match(regex_name, user_name) == None # # re.match(regex_password, password) is not None # # except: # 一定是Python内置的错误类型 # # print('请输入正确格式的用户名或密码') # # else: # if user_name == my_name and password == my_password: # print('成功登陆') # # else: # print('用户名或密码错误') print('-----------------beautiful-----------------------------------------') """ 处理FileNotFoundError: """ file_name = 'alice.txt' try: with open(file_name) as file: print(file.read()) except FileNotFoundError: msg = 'Sorry,the tile'+file_name+'does not exist.' print(msg) else: pass print('---------------------------------------------------') # split()方法根据空格分析文本,返回一个列表,不是根据符号,列表成分也不一定是单词 title = 'Alice , in Wonderland' print(title.split()) #>>>['Alice', ',', 'in', 'Wonderland'] """ 读取文章字节: """ file_name = 'Alice.py' try: with open(file_name) as file: file_content = file.read() # print(file_content) except FileNotFoundError: print('There is no such file.') else: content_list = file_content.split() print(content_list) print(len(content_list)) # split()--生成列表 # readlines() -- 生成列表 # 生成列表的都可以在with外使用 # 用try-except-else:属于优化代码,实际开发中也是必要的 print('----------------------------------') """ 失败时一声不吭: except: 用pass pass充当占位符,提醒自己在程序的某个地方什么都没有做,并且以后也需要在这里做些什么。 可能决定将找不到的文件的名称写入到文件missing_files.txt中。用户看不到这个文件,但自己可以读取这个文件,进而处理所有文件 找不到的问题。 """ """ 存储数据: 模块json能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。 还可以使用json在Python程序之间分享数据。 JSON数据格式并非Python专用的,能够将以JSON格式存储的数据于是用其他编程语言的人分享。 """ """ JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括Python在内的众多语言采用。 """
""" 使用json模块轻量存储数据 """ import json numbers = [1,2,3,4,5] file_name = 'number.json' with open(file_name,'w') as f_obj: json.dump(numbers,f_obj) # json.dump()接受两个实参,一个内容,一个文件名,后缀可用.json """ 使用json读取: """ with open(file_name) as f_obj: content = json.load(f_obj) print(type(content)) print(content) # <class 'list'> # 下载后的json文本同样可以在with块外操作 # 现在是读取到了内存中 # 什么时候才不能在with块外操作? print('------------------------') """ 存储用户生成的数据: """ # while True: user_name = input('What is your name?') file_name = 'username.json' with open(file_name,'w') as f_obj: json.dump(user_name,f_obj) print('We will remember you.') # if user_name == 'Q': # break # print('--------------------------') file_name = 'username.json' with open(file_name,'r') as f_obj: content = json.load(f_obj) # json.load()只有一个参数,就是文件名,从哪个文件下载 print('Welcome back,%s!'%content)
import json #json和普通读写的区别在哪里? # 普通读写:不用import json,with open()那里都是一样的,就是有个read()和write()方法 # json是json.dump()和json.load() file_name = 'username.json' try: with open(file_name) as f_obj: user_name = json.load(f_obj) except FileNotFoundError: user_name = input('What is your name?') # 这里的逻辑是:如果没有这个文件就把user_name重写进去 with open(file_name,'w') as f_obj: json.dump(user_name,f_obj) print('We will remember u.') else: print("Welcome back,%s!"%user_name) print('-----------------------------------')
import json """ 重构: 代码能正确地运行,但可作进一步改进,将代码划分为一系列完成具体工作的函数----重构。 让代码更清晰、更易于理解、更容易拓展。 """ def get_stored_username(): """ 如果存储了用户名,就获取它 """ file_name = 'username.json' try: with open(file_name) as f_obj: user_name = json.load(f_obj) except FileNotFoundError: return None else: return user_name def greet_user(): """ 问候用户,并指出其名字: """ user_name = get_stored_username() if user_name: # if None 不会有任何显示,是不是和设置成False是一样的?是的 # 这里直接写成if user_name非常的灵活 print("Welcome back,%s!" % user_name) else: user_name = input('What is your name?') file_name = 'username.json' with open(file_name, 'w') as f_obj: json.dump(user_name, f_obj) print('We will remember you,%s.'%user_name) greet_user() """ 这是一种不错的做法,函数要么返回预期的值,要么返回None """ print('-----------------------------------') def get_stored_username(): """ 如果存储了用户名,就获取它 """ file_name = 'username.json' try: with open(file_name) as f_obj: user_name = json.load(f_obj) except FileNotFoundError: return None else: return user_name def get_new_username(): user_name = input('What is your name?') file_name = 'username.json' with open(file_name, 'w') as f_obj: json.dump(user_name, f_obj) return user_name def greet_user(): user_name = get_stored_username() if user_name: print("Welcome back,%s!" % user_name) else: user_name = get_new_username() print("Welcome back,%s!" % user_name) greet_user() """ 要编写出清晰而易于维护和扩展的代码,这种划分工作必不可少 """