之前都是随用随学,想着系统学习一下python,就阅读了下《Python趣味编程入门》,都是些基础,但是也感觉还不错,一下是自己做的一些笔记。python趣味编程入门文章目录python趣味编程入门第2章 Python基础知识hello world使用变量取得输入字符串和数值函数挑战自我第3章 改变程序流程多重比较大于小于等于和不等于更多条件语句循环挑战自我第4章 用函数节约时间创建简单的函数传递参数pow 和 round第5章 处理数据什么是数据结构?元组的魔力列表和字典列表实时改变元素 enumerate排序 key=str.lower, reverse=True 小写字母 倒序添加、插入、删除字典创建 修改 添加 删除一个实例数据和函数挑战自我第6章 保存结果将数据保存到文件读取文本和二进制文件处理结构化数据读取二进制文件在文件中搜索处理Python数据picklejson挑战自我第7章 用模块做更多的事什么是模块?和Python捆绑的模块“OS”模块“time”模块“Math”和“Random”模块“socket”模块Pillow、Pygame、Tkinter挑战自我第8章 自成一类什么是类?取值方法、赋值方法和逻辑继承使用槽挑战自我第9章 示例程序击球游戏员工目录文本编辑器新闻标题作者:Mike Sounders姚军译第2章 Python基础知识hello worldprint("Hello World")1使用变量name = "kevin"print("Hello", name)取得输入username = input("Enter your name: ")print("Welcome", username)字符串和数值first = input("Enter first number: ")second = input("Enter second number: ")a = int(first) # 将first的字符串转化为数字b = int(second)print(a+b)函数a = int(input("Enter first num: "))b = int(input("Enter second num: "))print("the sum is ", a + b)挑战自我1.变量名有什么限制?必须要以字母开头,不能使用现有的函数或者关键字的名称2.如果变量"a"是包含"123"的字符串,如何将其转换成数字并保存在变量"b"中?b = int(a)3.什么是浮点数?带有小数点的数,比如1.2344."a=a+5"的简写方式是什么?a += 55.Python如何解读"10 + 5 * 3"?5乘以3,然后在结果上加上10第3章 改变程序流程多重比较a = 2name = "bob"if a == 2:print("a is 2")if name == "bob":print("and name is bob")print("Program ended")大于小于等于和不等于if a > 5:if a < 5:if a == 5:if a != 5:更多条件语句a = 2name = "Bob"if a == 2 and name == "Bob":print("a is 2")print("And name is Bob")a = 900name = "Bob"if a == 2 or name == "Bob":print("a is 2")print("And name is Bob")score = int(input("please input your score: "))if score >= 60:grade = "A"elif score >= 50:grade = "B"else:grade = "C"print("grade: ", grade)name = "Bob"print(name.lower()) # name.lower()方法是把“Bob”全部转化为小写字母循环a = 1while a <= 10:print("a is ", a)a += 1myList = [1, 2, 10, 100] # 列表用方括号表示,里面的数字为列表项for a in myList:print("a is ", a)"""range(1, 10)从1开始到9结束,当a等于10时,循环立即结束"""for a in range(1, 10):print("a is ", a)"""range(1, 10, 3)从1开始到9结束,3是每次循环的增量"""for a in range(1, 10, 3):print("a is ", a)挑战自我这个挑战太简单了,就不写了 哈哈第4章 用函数节约时间创建简单的函数注意:函数命名时候,不能以数字开头,不能包含标点符号,以及不能和现有的Python关键字或者函数同名。def say_hello():print("hello")def count_to_10():for i in range(1, 11):print(i)say_hello()count_to_10()say_hello()传递参数def add_numbers(x, y):print(x, "+", y, "=", x + y)def do_greeting(name="Tiger"): #默认为tigerprint("Hello", name)your_name = input("Enter name ")do_greeting(your_name)a = int(input("Enter the first number "))b = int(input("Enter the second number "))add_numbers(a, b)def add_numbers(x, y):return x + ya = int(input("Enter the number: "))b = int(input("Enter another: "))ans = add_numbers(a, b)print("Sum is ", ans)pow 和 roundpow(a, b) #以a为底的b次幂a = pow(2, 10)print(a)round()round(x) #默认取整round(x, n) #取x的前n位小数a = 6.55554print(round(a))print(round(a, 4))第5章 处理数据什么是数据结构?简单来说,就是存储数据的结构。my_string = "Hello"print(my_string[0]) # 只显示字符串中的元素H元组的魔力元组虽然很牛逼,但是初始化后,其内容就不能改变。元组和列表可以将不同的数据组合到单一名称下元组,是一种结构,可以将多个数据组合在单一的名称下。创建元组,需要将数据放在括号中,数据之间用逗号隔开。里面的数据可以是不同数据类型的。my_tuple = (1, "hello", 2)print(my_tuple[0])print(my_tuple[1])days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")x = int(input("Enter a day number: "))print(days[x-1])切片是有特定起始位置的一组元素来一波切片的例子:>>> m[:10]#取前十个数[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> m[-10:]#取后十个数[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]>>> m[10:20]#取前11-20个数[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]>>> m[:10:2]#前十个数中,每2个数取一个[0, 2, 4, 6, 8]>>> m[5:15:3]#第6-15个数中,每3个数取一个[5, 8, 11, 14]>>> m[::10]#所有的数中,每10个数取一个[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]>>> m[:]#什么都不写,可以原样复制一个list[0, 1, 2, 3, 4, 5, 6, 7,……,99]# 打印前三个元素my_tuple = (1, 2, 3, 4, 5)for x in my_tuple[0:3]:print(x)# 其实my_tuple[0:3]可以直接写成my_tuple[:3]或者my_tuple[:-2]# 打印元组后三个元素my_tuple = (1, 2, 3, 4, 5)for x in my_tuple[-3:]:print(x)# 每次循环跳过2个元素,打印结果为1,3,5my_tuple = (1, 2, 3, 4, 5)for x in my_tuple[::2]:print(x)# 小例子:利用切片实现trim(str)功能(类似于python中的strip()函数),即实现去除字符串前后的空格def trim(str):while str[:1] == ' ':str = str[1:]while str[-1:] == ' ':str = str[:-2]return strs = trim(" hello ")print(s)print(len(s))列表和字典列表列表和元素很像,列表用方括号定义,而元组用圆括号。# 利用切片打印列表的后三个元素my_list = [1, 2, 3, 4, 5]for x in my_list[-3:]:print(x)# 列表中的列表my_list = [[1, 2, 3], ["Bob", "Bill"]]print(my_list[1][0])print(my_list[0][2])for x in my_list[0]:print(x)实时改变元素 enumerate# 实时改变元素 enumeratemy_list = [20, 60, 500, 1200, 9000]for index, x in enumerate(my_list):my_list[index] = x * 2print(my_list)# 或者这样也行for index in enumerate(my_list):my_list[index[0]] = index[1] * 2print(my_list)排序 key=str.lower, reverse=True 小写字母 倒序# 排序 key=str.lower, reverse=True 小写字母 倒序my_list = [1, 5, 2, 4, 3]my_list.sort()print(my_list)# 排序的时候大写字母优先,所以可以把所有字母先都转为小写字母再进行排序my_list = ["My", "name", "is", "Bill"]my_list.sort()print(my_list)# key=str.lowermy_list.sort(key=str.lower)print(my_list)my_list.sort(key=str.lower, reverse=True)print(my_list)添加、插入、删除# 添加元素my_list = [20, 60, 500, 1200, 9000]my_list.append(10)print(my_list)# 插入元素my_list = [20, 60, 500, 1200, 9000]# 位置-在这个位置前插入 要插入的元素my_list.insert(0, 10)print(my_list)# 删除元素 根据内容删除用remove(x) 根据索引删除用 pop(index)my_list = [20, 60, 500, 1200, 9000, 500]my_list.remove(500)print(my_list)# 如果列表中有多个重复的,它会默认删掉第一个, 要想都删掉可以这样my_list = [20, 60, 500, 1200, 9000, 500, 500]for x in range(0, my_list.count(500)):my_list.remove(500)print(my_list)print(my_list.pop(2))print(my_list)my_list = [10, 20, 60, 500, 1200, 9000]print(my_list)x = int(input("Enter the num: "))y = my_list.pop(x)print("It contained ", y)字典用大括号创建字典,在括号中,放入“键”和“值”的配对,两者用冒号连接在一起。键是我们用于引用字典中元素的名称,值则是它们的数据注意:键名必须是唯一的创建 修改 添加 删除# 创建 修改 添加 删除# 创建employees = {"Bob": 1234, "Steve": 5678, "Mike": 9012}print(employees["Bob"])# 修改employees["Bob"] = 777print(employees["Bob"])# 添加employees["Stable"] = 321print(employees)# 删除del employees["Bob"]print(employees)employees = {"Bob": 1234, "Steve": 5678, "Mike": 9012}text = ""while text != "q":text = input("Enter a name or 'q' to quit: ")if text == "q":breakif text in employees:print(employees[text])else:print("Not Found")一个实例def load_data(filename):print("XXX NOT IMPLEMENTED")def save_data(filename):print("XXX NOT IMPLEMENTED")employees = {"Bob": 1234, "Steve": 5678, "Mike": 9012}text = ""while text != "q":print("\n---Employee Dictionary Tool 1.0---")print("Enter 'f' to find, 'a' to add, 'd' to delete")print("'l' to load, 's' to save, 'q' to quit")text = input("Your option: ")if text == "q":breakelif text == "f":text = input("Enter name: ")if text in employees:print(employees[text])else:print("Not Found")elif text == 'a':text == input("Enter new name: ")value = int(input("Enter num: "))employees[text] = valueprint(text, "add successful")elif text == 'd':text = input("Enter name: ")if text in employees:del employees[text]print(text, "deleted successful")else:print(text, "is Not Found")elif text == 'l':text = input("Enter filename: ")load_data(text)print("file loaded")elif text == 's':text = input("Enter filename: ")save_data(text)print("file saved")else:print("unvalid order, please input again")数据和函数函数,返回多个值,可以直接返回列表def my_func2():return 10, 200, 360def my_func():return [10, 200, 360]my_list = my_func()print(my_list)函数,传参穿多个参数,需要加上*‘*’可以表示乘法,任意函数参数 和 元组/列表的拆解# 在numbers前面加了一个*,就将numbers变成了一个元组,传递给参数的所有数值(不论有多少个),都被放到这个元组中def average(*numbers):result = sum(numbers) / len(numbers)return resultprint(average(1, 2, 3))def average(*numbers):result = sum(numbers) / len(numbers)return resultmy_tuple = (1, 2, 3)print(average(*my_tuple))my_list = (5, 6, 7)print(average(*my_list))挑战自我1.如果字符串变量“mystring”包含“Hello”,如何引用包含字母“o”的元素?mystring[4] 或者 mystring[-1]2.元组和列表之间有何不同?元组使用圆括号,元组内元素不可改变;列表使用方括号,列表内元素可以改变。3.如果“mylist”是一个姓名列表,你希望对它进行大小写不敏感的排序,如何实现?key=str.lower4.如果你有一个名为“employees”的字典,如何删除键为“Bob”的元素?if “Bob” in employees:del employees[“Bob”]5.如何定义一个“summary”函数,使它可以调用“data”中任意个数的元素?def summary(*data)第6章 保存结果将数据保存到文件# r读 w写 a续写# 需要手动关闭文件filename = "C:/Users/Administrator/Desktop/data.txt"file = open(filename, "w")file.write("hello world")file.close()try:my_file = open("C:/Users/Administrator/Desktop/data.txt", "w")except OSError as err:print(err)print("Moving on...")# 不需要手动关闭文件with open(filename, "w") as my_file:my_file.write("Hello, world!\n")my_file.write("We're learning coding.\n")print("Program running")读取文本和二进制文件try except 可以优雅的处理错误try:filename = "C:/Users/Administrator/Desktop/data.txt"my_file = open(filename, "r")# 读取文件的每一行 end=""不添加换行符for text_line in my_file:print(text_line, end="")print("file opened")my_file.close()except OSError as err:print("file couldn't be opened")print(err)# 或者try:filename = "C:/Users/Administrator/Desktop/data.txt"with open(filename, "r") as my_file:for text_line in my_file:print(text_line, end="")except OSError as err:print("file couldn't be opened")print(err)read()方法可以读取文件的所有数据,并且放到text_data中。读取的是原始数据,包括换行符和其他常规文本汇总不可见的符号。一旦python读取文件后,它会自动关闭文件,不需要重复这一工作。readlines()方法也可以,只不过返回的是一个列表,text_list是一个包含文件所有行的列表,text_list[0]包含第一行,text_list[1]包含第二行,以此类推。filename = "C:/Users/Administrator/Desktop/data.txt"text_data = open(filename, "r").read()print(text_data)text_list = open(filename, "r").readlines()for text_line in text_list:print(text_line, end="")处理结构化数据# 创建空白字典employees = {}try:filename = "C:/Users/Administrator/Desktop/employees.txt"my_file = open(filename, "r")# 遍历文件每一行for text_line in my_file:my_list = text_line.split(",")# rstrip()方法 删除该字符串后面多余的数据比如 换行符 空格等employees[my_list[0]] = int(my_list[1].rstrip())my_file.close()print(employees)except OSError as err:print(err)读取二进制文件如果以纯文本格式打印“image.dat”的内容,只会看到毫无意义的数据和古怪的字符,因为这种文件不是以纯文本方式处理的。# rb 以二进制模式读取文件filename = "C:/Users/Administrator/Desktop/image.dat"my_data = open(filename, "rb").read()# 循环读取每一个字节 end=" " 打印每个字节的值(后面加上一个空格)for x in my_data:print(x, end=" ")filename = "C:/Users/Administrator/Desktop/image.dat"with open(filename, "rb") as my_file:# 从文件中读取一个字节byte = my_file.read(1)# 如果是一个空字节,说明已到文件末尾 “b”是确认我们处理的是一个字节while byte != b"":# ord()以人类可读的方式打印包含在字节内的数值print(ord(byte), end=" ")byte = my_file.read(1)import sys# 从命令行获取文件名# sys.argv 包含用户运行程序在命令行输入的一个参数列表# sys.argv[0]是程序本身的名称,也就是“book.py” 更多的参数会依次保存在后面if len(sys.argv) == 1:print("No filename specified")sys.exit(1)try:my_file = open(sys.argv[1], "r").read()print(my_file)except OSError as err:print("File couldn't be opened")print(err)在文件中搜索try:filename = "C:/Users/Administrator/Desktop/data.txt"# 将数据读入一个列表my_list = open(filename, "r").readlines()for counter, line in enumerate(my_list):# line.lower.find()可以在查找的时候忽略大小写loc = line.find("moon")# 若location不等于-1,则表明已经找到该字符串if loc != -1:print("Found on line", counter+1, "position", loc)except OSError as err:print("File couldn't opened")print(err)try:filename = "C:/Users/Administrator/Desktop/image.dat"num = int(input("Enter a number to find in image.dat: "))offset = int(input("Enter an offset to search from: "))with open(filename, "rb") as my_file:# seek可以更改文件中的当前位置my_file.seek(offset)# 使用read()函数后,python将更新自己内部的文件位置计数器,tell()函数可以返回位置# 因为read递增文件位置,所以文件的当前位置在该数值之后,所以结果减去1才是数字的正确位置byte = my_file.read(1)while byte != b"":if ord(byte) == num:# 返回文件中的当前位置print(num, "found at position", my_file.tell()-1)byte = my_file.read(1)except OSError as error:print("File couldn't opened")print(error)在二进制文件中,如果每次读取一个字节,大小范围是0~255,如果想查找更大的数就需要每次读取两个字节。try:filename = "C:/Users/Administrator/Desktop/image.dat"num = int(input("Enter a number to find in image.dat: "))with open(filename, "rb") as my_file:bytes = my_file.read(2)while bytes != b"":# 把两个字节合成一个整数, 将字节生成整数时,将字节顺序设置为littleif int.from_bytes(bytes, byteorder="little") == num:# 返回文件中的当前位置 因为read(2)在返回数据之后将位置向后移动了两个字节,# 所以减去2才能得到数据的原始位置print(num, "found at position", my_file.tell()-2)bytes = my_file.read(2)except OSError as error:print("File couldn't opened")print(error)处理Python数据pickle如果想把python数据快速保存到磁盘,方便以后的读取,可以对数据进行“腌制”(Pickling)。就是它不能在常规文本编辑器中编辑“腌制”过得python数据,使用(读取)起来很方便。# 在python中增加“腌制”功能import pickleemployees = {"Bob": 1234, "Steve": 5678, "Mike": 9012}try:# 以二进制方式写入数据with open("employees.p", "wb") as my_file:# 在文件中创建字典pickle.dump(employees, my_file)except OSError as err:print("File couldn't open")print(err)try:with open("employees.p", "rb") as my_file:# 从文件中获取数据employees = pickle.load(my_file)print(employees)except OSError as err:print("File couldn't open")print(err)jsonimport jsonemployees = {"Bob": 1234, "Steve": 5678, "Mike": 9012}try:# 以纯文本的方式写入数据with open("employees.json", "w") as my_file:json.dump(employees, my_file)print(json.dumps(employees, indent=4))except OSError as err:print(err)try:# 以纯文本的方式写入数据with open("employees.json", "r") as my_file:employees = json.load(my_file)print(json.dumps(employees, indent=4))except OSError as err:print(err)import jsontry:with open("data.json", "r") as my_file:goods = json.load(my_file)id_to_find = int(input("Enter an item ID: "))# 列表推导 即用一个列表生成另一个列表 reslut中的每个元素都是一个商品的所有信息result = [my_item for my_item in goods if my_item["id"] == id_to_find]if len(result) > 0:# 因为result是包含单个字典的列表,所以要用result[0]print("Name: ", result[0]["name"])print("Price: ", result[0]["price"])print("Games:", end=" ")for game in result[0]["games"]:print(game, end=" ")print("")else:print("Not Found")except OSError as err:print(err挑战自我1.python中用哪一个字符序列表示换行符?\n2.当打开文件、以二进制模式写入时用什么代码?open(filename, “rb”)3.从文件读取二进制字节时,用哪个命令切换到文件中特定位置?file.seek(offset)4.当两个字节组合成一个字时,这时候值得范围是?0~655355.如果用户在运行程序时输入一个文件名参数,如何用代码访问它?import syssys.argv[1]第7章 用模块做更多的事什么是模块?简单来说,模块就是保存在单独文件中的一段python代码。模块需要导入才能用,python默认情况下是内存友好的,如果每次运行都需要加载所有模块,那么占据的内存就大的多。导入模块,可以用import sys 或者按名称导入特定功能。如果按照名称导入特定功能,在使用这些函数时候不需要再“sys.”前缀,在某些情况下很实用。from sys import argv, exitif len(argv) == 1:print("No filename specified!")exit(1)from sys import platform, version_info, exit# version_info 包含如下信息的一个元组(主版本号、此版本号、小版本(修订)号、发行级别)# 发行级别是一个字符串,内容为 alpha beta candidate 或者 final,前三个表示开发人员仍未完成的Python版本 所以如果想保证# 在稳定的版本下运行,可以查看最后两行print("Running on: ", platform)# win32 表示Windows(即使是使用64位版本的Windows)、 linux表示Linux、darwin表示MacOSprint("Python version: ", end=" ")# sep="."表示用点分隔版本号print(version_info[0], version_info[1], version_info[2], sep=".")if version_info[3] != "final":print(version_info[3])print("Error: please use a released version of Python")exit(1)和Python捆绑的模块“OS”模块“OS”模块是Python与操作系统的接口。通过该模块,可以让操作系统完成一些任务。但是,当我们想清除屏幕,这个指令在不同的系统下命令也不同,所以应该事先判断下是哪个系统。当然, 自己也可以创建一个模块,方便代码复用,比如创建一个“mymodule.py”文件,在别的地方使用里面的函数或者变量的时候,直接import mymodule.py即可。import sysimport osif sys.platform == "win32":os.system("cls")else:os.system("clear")print("Done")import oswidth, height = os.get_terminal_size()print("Window width: ", width)print("Window height: ", height)“time”模块# %H小时 %M分钟 %S秒 %B月份名称 %m月份序号 %A周名称my_time = time.strftime("%H:%M:%S")hour = int(time.strftime("%H"))print(my_time)print(hour)“Math”和“Random”模块import mathradius = int(input("Enter circle radius: "))# radius**2 求幂运算 2是舍入到小数点后两位print("Area is", round((radius**2)*math.pi, 2))随机数的典型应用之一是在生成某个数值时执行特定的操作。import random# 初始化Python随机数生成器random.seed()for x in range(1, 21):print("Move", x, end="")# randint可以用randrange()替换,其中有三个参数 一个开始值,一个结束值,一个是可能结果之间的的差值my_random = random.randint(1, 5)# 由于生成随机数的范围是1到5,所以生成1的概率是20%if my_random == 1:print(" - moving down")else:print(" - staying still")print("100 random numbers between 1 and 10: ")for x in range(0, 100):# 产生1到10之间的随机数print(random.randint(1, 10), end=" ")“socket”模块import socket# 准备一个网络套接字连接my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接到NetBSD Web服务计算机的80端口# 之所以用两重括号,是因为connect函数期待得到的参数是一个元组my_socket.connect(("www.netbsd.org", 80))# 发送主页请求my_socket.send(b"GET/HTTP/1.0\n\n")# 从服务器接受1024字节个数据res = my_socket.recv(1024)while res != b"":print(res)# 不断从网站接收和打印数据,直到没有更多数据传送为止res = my_socket.recv(1024)Pillow、Pygame、Tkinter# 打印一张图像的原始信息from PIL import Imageorig_pic = Image.open("image.png")print("Format: ", orig_pic.format)print("Width: ", orig_pic.size[0])print("Height: ", orig_pic.size[1])# 导入加载图像和添加图像滤镜的例程from PIL import Image, ImageFilterimport sys# 初始化缩略图的大小thumbnail_size = (50, 50)filename = input("Enter an image file: ")# 尝试打开文件,如果失败则显示错误信息try:orig_pic = Image.open(filename)print("Format: ", orig_pic.format)print("Width: ", orig_pic.size[0])print("Height: ", orig_pic.size[1])except OSError as err:print(err)exit(1)print("Progressing...")# 在“blurred_pic”中制作一份“orig_pic”数据的拷贝,添加一个滤镜blurred_pic = orig_pic.filter(ImageFilter.BLUR)# 将数据缩小blurred_pic.thumbnail(thumbnail_size)# 把数据保存到扩展名为“.jpeg”的文件中new_filename = filename.split(".")[0]blurred_pic.save(new_filename + ".jpeg")print("Format: ", blurred_pic.format)print("Width: ", blurred_pic.size[0])print("Height: ", blurred_pic.size[1])import pygame# 启动Pygamepygame.init()# 创建新的游戏屏幕,分辨率由一个新的元组指定screen = pygame.display.set_mode((640, 480))# 用RGB格式的颜色元组填充到屏幕 (红,绿,蓝)screen.fill((0, 255, 0))# 将所有颜色变化渲染到屏幕上pygame.display.flip()# 延时3秒pygame.time.wait(3000)import pygameimport sys# 启动Pygamepygame.init()# 创建游戏屏幕,分辨率由一个新的元组指定screen = pygame.display.set_mode((640, 480))# 从文件加载图像,保存在“ball”对象中ball = pygame.image.load("ball.bmp")# 球的初始位置X和Yball_x = 100ball_y = 100# 每次循环中球的位置的增加量ball_x_speed = 7ball_y_speed = 7while 1:for event in pygame.event.get():# 检查操作系统事件,如果窗口关闭则退出if event.type == pygame.QUIT:sys.exit(1)ball_x += ball_x_speedball_y += ball_y_speed# 边界条件if ball_x > 610:ball_x_speed = -7if ball_y > 450:ball_y_speed = -7if ball_x < 0:ball_x_speed = 7if ball_y < 0:ball_y_speed = 7# 用RGB格式的颜色元组填充屏幕screen.fill((90, 230, 90))# 在指定的X和Y坐标处绘制球screen.blit(ball, (ball_x, ball_y))# 将所有变化渲染到画布上pygame.display.flip()# 延时10毫秒pygame.time.wait(10)from tkinter import *# 创建主窗口root_win = Tk()# 创建新的文本标签my_label = Label(root_win, text="Shiny GUI app!")# 将标签放到窗口内my_label.pack()# 创建窗口大小root_win.geometry("200x100")# 运行程序,处理事件root_win.mainloop()import mathfrom tkinter import *# 点击计算按钮时,运行该函数def calc_area(*args):area_result = (float(radius.get()) ** 2) * math.pi# 保留小数点后两位area.set(round(area_result, 2))root_win = Tk()# 设置标题root_win.title("Area calculator")# 设置窗口大小root_win.geometry("200x100")# 创建Tkinter字符串变量 记录半径和面积radius = StringVar()radius.set("0")area = StringVar()area_label = Label(root_win, text="Area: ").grid(column=1, row=1)area_value = Label(root_win, textvariable=area).grid(column=2, row=1)radius_label = Label(root_win, text="Radius: ").grid(column=1, row=2)radius_value = Entry(root_win, width=7, textvariable=radius).grid(column=2, row=2)calc_button = Button(root_win, text="Calculate", command=calc_area).grid(column=2, row=3)root_win.mainloop()挑战自我1.Python程序如何确定运行的操作系统?sys.platform导入sys模块,并检查“sys.platform”,“Windows”为“win32”,Linux为“Linux”,MacOS为“darwin”。2.如何让操作系统运行“test.exe”?导入os模块,并执行os.system(“test.exe”)3.如何产生20~90之间的随机数?random.randint(20, 90)4.使用Python时,我们在绘图操作之后必须做什么,才能始终确保结果显示在屏幕上?pygame.display.flip()5.如何制作自己的模块?将变量和函数定义放在单独的文件(如“mymodule.py”)中,然后再主代码文件中使用“import mymodule”第8章 自成一类什么是类?类很像是一个函数,但是必须创建包含类中数据的对象,才能使用它们。# 类定义class Myclass:# 类函数(方法)def say_hello(self):print("Hello")# 对象x = Myclass()x.say_hello()# 另一个对象y = Myclass()y.say_hello()self用于引用对象自己的变量拷贝class Employee:# 这个方法在函数创建时,自动运行def __init__(self, passed_name, passed_number):self.name = passed_nameself.number = passed_numberdef show(self):print("Name: ", self.name)print("Number: ", self.number)first = Employee("Bob", 1234)second = Employee("Steve", 5678)first.name = "Stable"first.number = 777first.show()second.show()类变量—所有实例共有class Employee:employee_count = 0def __init__(self, passed_name, passed_number):self.name = passed_nameself.number = passed_numberEmployee.employee_count += 1def show(self):print("Name: ", self.name)print("Number: ", self.number)first = Employee("Bob", 1234)second = Employee("Steve", 5678)print(Employee.employee_count)取值方法、赋值方法和逻辑可以通过first.number=9000这样来赋值,但是有时候如果类能够在为属性赋值之前进行一些检查,就会更实用。class Myclass:def __init__(self, num_passed):self.number = num_passed# 程序获取number时候调用的方法@propertydef number(self):print("Getting number...")# self.__num 私有变量,在类内部使用return self.__number# 程序设置number的时候调用的方法@number.setterdef number(self, num_passed):print("Setting number...")if num_passed > 1000:self.__number = 1000else:self.__number = num_passedfirst = Myclass(123)print(first.number)first.number = 9000print(first.number)import pygameimport sysclass Ball:# 设置小球的初始位置、速度和图像def __init__(self, x, y):self.ball_x = xself.ball_y = yself.ball_x_speed = 7self.ball_y_speed = 7self.ball_pic = pygame.image.load("ball.bmp")def update(self):self.ball_x += self.ball_x_speedself.ball_y += self.ball_y_speedif self.ball_x > 610: self.ball_x_speed = -7if self.ball_y > 450: self.ball_y_speed = -7if self.ball_x < 0: self.ball_x_speed = 7if self.ball_y < 0: self.ball_y_speed = 7# 在屏幕上绘制小球def render(self):screen.blit(self.ball_pic, (self.ball_x, self.ball_y))pygame.init()screen = pygame.display.set_mode((640, 480))ball1 = Ball(10, 10)ball2 = Ball(100, 150)ball3 = Ball(70, 30)ball4 = Ball(350, 200)while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit(1)screen.fill((90, 230, 90))ball1.update()ball1.render()ball2.update()ball2.render()ball3.update()ball3.render()ball4.update()ball4.render()pygame.display.flip()pygame.time.wait(1)继承class Vehicle:def __init__(self, x, y):self.x_pos = xself.y_pos = yself.x_speed = 0self.y_speed = 0def update(self):print("Moving...")self.x_pos += self.x_speedself.y_pos += self.y_speeddef render(self):print("Drawing")# 从“Vehicle”类继承方法和属性class Digger(Vehicle):def __init__(self, x, y):Vehicle.__init__(self, x, y)def dig(self):print("Digging...")class Helicopter(Vehicle):def __init__(self, x, y, height):Vehicle.__init__(self, x, y)self.z_pos = heightcar = Vehicle(10, 20)car.update()car.render()digger = Digger(30, 40)digger.dig()chopper = Helicopter(50, 60, 70)chopper.update()# 使用槽# 通常,在创建对象时,可以在程序中添加额外的属性,即使这些属性定义不在类定义中。class Myclass:def __init__(self, passed_number):self.number = passed_numberx = Myclass(10)print(x.number)x.name = "Steven"print(x.name)#print(x.__dict__)# 对于许多程序,能够实时创建新属性是一种优势。但是这也有一些缺点:属性保持在一个字典中,需要花时间处理,内存的利用也不是很有效。这种对象特有的词典被称为_dict__ 两边各有两个下划线。# 为了改进性能,节约内存,我们可以告诉Python不要使用字典保存示例属性,并且可以指定允许创建哪些属性。通过“槽”可以实现。class Myclass(object):# 指定允许创建的属性__slots__ = {"number", "name"}def __init__(self, passed_number):self.number = passed_numberx = Myclass(10)print(x.number)x.name = "Steven"print(x.name)"""挑战自我1.如何调用类定义中的函数?一个方法2.如何快速分清函数调用和创建类的新实例?一般来说,类名首字母大写。3.__init__方法有何特别之处?实例化对象的时候自动调用4.什么是赋值方法?在进行赋值或者更改时,会自动调用5.什么是“类变量”?类变量是多有实例能共享的变量第9章 示例程序击球游戏"""import pygameimport sysimport random# 启动pygamepygame.init()# 设计游戏屏幕,分辨率由一个元组组成screen = pygame.display.set_mode((640, 480))# 设置一种新字体font = pygame.font.Font(None, 36)score = 0# 从文件中加载图像,保存在“ball”对象中ball = pygame.image.load("ball.bmp")# 从文件中加载图像,保存在“ball”对象中bat = pygame.image.load("bat.bmp")bat_x = 260bat_y = 430# 小球的初始坐标X Y 及其速度ball_x = 10ball_y = 10ball_x_speed = 7ball_y_speed = 7while 1:for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit(1)score += 1# 检测左右光标键是否按下# 对应地移动球拍pressed = pygame.key.get_pressed()if pressed[pygame.K_RIGHT] and bat_x < 512:bat_x += 15if pressed[pygame.K_LEFT] and bat_x > 0:bat_x -= 15ball_x += ball_x_speedball_y += ball_y_speed# 碰撞检测代码if ball_x > bat_x and ball_x < bat_x + 112 and ball_y > 400:ball_y_speed = -(random.randint(5, 15))if ball_x > 610:ball_x_speed = -random.randint(5, 15)if ball_y > 450:breakif ball_x < 0:ball_x_speed = random.randint(5, 15)if ball_y < 0:ball_y_speed = random.randint(5, 15)# 用RGB格式的颜色元组填充到屏幕screen.fill((90, 230, 90))# 生成并呈现分数文本scoretext = font.render("Score: " + str(score), 1, (30, 30, 30))screen.blit(scoretext, (10, 10))# 绘制小球screen.blit(ball, (ball_x, ball_y))# 绘制挡板screen.blit(bat, (bat_x, bat_y))# 刷新屏幕pygame.display.flip()# 延时pygame.time.wait(20)print("Your score is : ", score)# 员工目录import sysimport osimport dill as pickleclass Employee(object):def __init__(self, passed_name, passed_number, passed_comment):self.name = passed_nameself.number = passed_numberself.comment = passed_commentdef find(self, search_term):if self.name.lower().find(search_term.lower()) != -1:return 1elif self.number.lower().find(search_term.lower()) != -1:return 1elif self.comment.lower().find(search_term.lower()) != -1:return 1else:return 0def show(self):print("Name: ", self.name)print("Number: ", self.number)print("Comment: ", self.comment)def load_data(filename):try:global employeesfile_data = open(filename, "rb")employees = pickle.load(file_data)input("\nData loaded - hit enter to continue...\n")file_data.close()except OSError as err:print(err)sys.exit(1)def save_data(filename):try:global employeesfile_data = open(filename, "wb")pickle.dump(employees, file_data)file_data.close()input("\nData loaded - hit enter to continue...\n")except OSError as err:print(err)sys.exit(1)employees = []choice = 0# if len(sys.argv) == 1:# print("No filename specified - starting with empty data")# input("Hit enter to continue...")# else:# load_data(sys.argv[1])while choice != 6:if sys.platform == "win32":os.system("cls")else:os.system("clear")print("\n=====Employee Dictionary Manager 2.0 =====\n")print("1.List employees")print("2.Add employee")print("3.Delete employee")print("4.Search employee")print("5.Save data")print("6.Quit")choice = int(input("Please enter your choice"))if choice == 1:for x in range(0, len(employees)):print("\nEmployee number: ", x + 1)employees[x].show()input("\nHit enter to continue...")elif choice == 2:name = input("\nEnter the employee name: ")number = input("\nEnter the employee number: ")comment = input("\nEnter the employee comment: ")employees.append(Employee(name, number, comment))input("\nHit enter to continue...")elif choice == 3:number = input("\nEnter employee number to remove")if number > len(employees):input("No such employee!Hit enter to continue...")else:del employees[number - 1]input("\nEmployee removed - hit enter to continue...")elif choice == 4:search_term = input("\nEnter a name, number, or comment: ")for x in range(0, len(employees)):result = employees[x].find(search_term)if result == 1:print("\nEmployee number: ", x + 1)employees[x].show()input("\nHit enter to continue...")elif choice == 5:filename = input("\nEnter a filename: ")save_data(filename)# 文本编辑器from tkinter import *from tkinter import filedialog, messagebox, scrolledtextimport sysdef open_file():file = filedialog.askopenfile(mode="r")if file != None:# 1.0表示从文本的第一个字符text.delete("1.0", END)text.insert("1.0", file.read())file.close()def save_file():file = filedialog.asksaveasfile(mode="w")if file != None:file.write(text.get("1.0", END))file.close()def about_dialog():messagebox.showinfo("About", "Version1.0\nEnjoy!")def exit_app():sys.exit(0)# 创建窗口root_win = Tk()root_win.title("TextEditor")root_win.geometry("640x480")# 创建新菜单main_menu = Menu(root_win)root_win.config(menu=main_menu)# 在菜单栏上创建一个新项目file_menu = Menu(main_menu)main_menu.add_cascade(label="File", menu=file_menu)# 在File菜单中增加项目file_menu.add_command(label="Open", command=open_file)file_menu.add_command(label="Save", command=save_file)file_menu.add_command(label="About", command=about_dialog)file_menu.add_command(label="Exit", command=exit_app)text = scrolledtext.ScrolledText(root_win, width=80, height=30)text.pack(fill="both", expand="yes")root_win.mainloop()新闻标题import feedparser, timeimport sys, osSubtitle = input("\nEnter the Subtitle(eg'pictures') to view")no_of_items = int(input("\nHow many headlines do you want to show?"))show_urls = input("Show URLs as well? y/n: ")filter = input("\nEnter a word or term you want to filter out: ")while 1:if sys.platform == "win32":os.system("cls")else:os.system("clear")myfeed = feedparser.parse("https://www.news.cn/r/" + Subtitle + "/.rss")if len(myfeed["entries"]) == 0:print("Subtitle not valid!")sys.exit(1)x = 1for post in myfeed.entries:if len(filter) > 0:if post.title.lower().find(filter.lower()) == -1:print("* " + post.title)if show_urls == "y":print(" (" + post.link + ")")else:print("* " + post.title)if show_urls == "y":print(" (" + post.link + ")")x += 1if x > no_of_items:breaktime.sleep(60)————————————————
文章转载自阿语python,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




