• 20191218 实验四《Python程序设计》实验报告


    20191218 2020-2021-2 《Python程序设计》实验四报告

    课程:《Python程序设计》
    班级: 1912
    姓名: 唐启恒
    学号:20191218
    实验教师:王志强
    实验日期:2021年6月24日
    必修/选修: 公选课

    一、实验内容

    • Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。

    (1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)10分
    (2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。10分。
    (3)在实践报告中,需要对全课进行总结,并写课程感想体会、意见和建议等。5分

    二、实验过程

    1.网络爬虫实战

    需求分析:发送请求获得返回数据、解析获得数据、输出解析后的数据。
    需要调用的库:re、requests。

    (1)淘宝网爬虫

    创建函数

    需求分析:发送请求获得返回数据、解析获得数据、输出解析后的数据。
    需要调用的库:re、requests。

    • getHTMLText函数:对服务器发送请求并获得返回数据

        def getHTMLText(url):
        	try:
        		header = {
        			'authority': 's.taobao.com',
        			'cache-control': 'max-age=0',
        			'upgrade-insecure-requests': '1',
        			'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
        			'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
        			'referer': 'https://s.taobao.com/search?q=%E4%B9%A6%E5%8C%85&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.2017.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170306',
        			'accept-encoding': 'gzip, deflate, br',
        			'accept-language': 'zh-CN,zh;q=0.9',
        			'cookie': 'cna=of0cFi+PRlkCAXAga/Rh5jS/; thw=cn; miid=1746754052324791774; t=666c0abca91eaba189bedb8dc7cd9af4; cookie2=1eaa7669168b838f207f946a56d6c06e; v=0; _tb_token_=e3e75bafeab75; _samesite_flag_=true; sgcookie=E0CPuRRNCb3UsPzEfu8ez; unb=2201465236169; uc3=id2=UUphy%2FZ8WVQTGEtLSA%3D%3D&nk2=F5RNZTsZefZoa8k%3D&vt3=F8dBxGepHC4UCW39woY%3D&lg2=UIHiLt3xD8xYTw%3D%3D; csg=76e486aa; lgc=tb801621930; cookie17=UUphy%2FZ8WVQTGEtLSA%3D%3D; dnk=tb801621930; skt=5159b705fae0ca1b; existShop=MTU5MDkyNjE3MQ%3D%3D; uc4=id4=0%40U2grEJGD1caelul1pbdrh9%2FZHNY3neYE&nk4=0%40FY4GsvRAzezC4KJ%2F6Fq%2BPUeNQ5BcAA%3D%3D; tracknick=tb801621930; _cc_=UIHiLt3xSw%3D%3D; _l_g_=Ug%3D%3D; sg=09c; _nk_=tb801621930; cookie1=U7Gmn5kRAszHsmIsFcN1Y6rDPBjpuYddw9YlBSNITsY%3D; enc=JDI2YJQr%2Fg4gc0f7829oFezKf9MFrM%2BUlJZ5JBY%2BEdOSe%2B%2FAum2YSuESyxnliSWuHaiCwNzPAjY7BTLPa4m%2FaHJdUFL1HRK3vGT2eEY7UHE%3D; tfstk=cOkVBSbAMKpVkry69-wafcZzA2AfaQUgRTrUiXN6mk92_GVb8sXPWuMlJurNaWNc.; mt=ci=12_1; hng=CN%7Czh-CN%7CCNY%7C156; UM_distinctid=1726a96e2ab3d8-0a6e4de9b0dc43-3a65420e-144000-1726a96e2ac9d1; alitrackid=www.taobao.com; lastalitrackid=www.taobao.com; CNZZDATA1277659945=1256986223-1590926173-%7C1590926292; uc1=cookie15=WqG3DMC9VAQiUQ%3D%3D&existShop=false&pas=0&cookie21=Vq8l%2BKCLjA%2Bl&cookie16=URm48syIJ1yk0MX2J7mAAEhTuw%3D%3D&cookie14=UoTV7N%2B0xtxMZQ%3D%3D; JSESSIONID=CB695AD612260F9E44DDD5E96A505328; l=eBSA3l3gqv46Q3ayBOfZourza77OSIRYIuPzaNbMiOCP_7fp51ChWZv0tj89C3GVh6xXR3u14VQeBeYBqQOSnxv92j-la_kmn; isg=BCAgnhN2arDKctWRuj9ghLH78S7yKQTz4pJPapox7DvOlcC_QjnUg_alKT0VHLzL',
        		}
      
        		r = requests.get(url, headers=header)
        		r.raise_for_status()
        		r.encoding = r.apparent_encoding
        		return r.text
        	except:
        		return "F"
      
    • parsePage函数:通过正则表达式对获得的html文本进行解析,获得我们想要得到的内容。

        def parsePage(ilt, html):
        	try:
        		plt = re.findall(r'"view_price":"[d+.]*"', html)
        		tlt = re.findall(r'"raw_title":".*?"', html)
        		for i in range(len(plt)):
        			price = eval(plt[i].split(':')[1])
        			title = eval(tlt[i].split(':')[1])
        			ilt.append([price, title])
        	except:
        		print("F")
      
    • printGoodsList函数:输出解析过的内容,同时使用正则表达式对输出进行格式化。

        def printGoodsList(ilt):
        	tplt = "{:4}	{:8}	{:16}"
        	print(tplt.format("序号", "价格", "商品名称"))
        	count = 0
        	for g in ilt:
        		count = count + 1
        		print(tplt.format(count, g[0], g[1]))
      

    其中,头部Head的设置是为了绕过反爬虫机制。
    在刚开始写代码时,程序运行并没有输出。检查请求状态码,发现状态码为200,能够正常访问。查找资料后发现,淘宝网设置了反爬虫机制,结合上课所学内容,进行了header中代理的仿用户处理。
    image

    进行爬虫
    image

    (2)京东网爬虫

    创建函数

    定义函数抓取每页前30条商品信息

    def crow_first(n):
    	# 构造每一页的url变化
    	url = 'https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&cid2=653&cid3=655&page=' + str(
    		2 * n - 1)
    	head = {'authority': 'search.jd.com',
    			'method': 'GET',
    			'path': '/s_new.php?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&cid2=653&cid3=655&page=4&s=84&scrolling=y&log_id=1529828108.22071&tpl=3_M&show_items=7651927,7367120,7056868,7419252,6001239,5934182,4554969,3893501,7421462,6577495,26480543553,7345757,4483120,6176077,6932795,7336429,5963066,5283387,25722468892,7425622,4768461',
    			'scheme': 'https',
    			'referer': 'https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&cid2=653&cid3=655&page=3&s=58&click=0',
    			'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36',
    			'x-requested-with': 'XMLHttpRequest',
    			'Cookie': 'qrsc=3; pinId=RAGa4xMoVrs; xtest=1210.cf6b6759; ipLocation=%u5E7F%u4E1C; _jrda=5; TrackID=1aUdbc9HHS2MdEzabuYEyED1iDJaLWwBAfGBfyIHJZCLWKfWaB_KHKIMX9Vj9_2wUakxuSLAO9AFtB2U0SsAD-mXIh5rIfuDiSHSNhZcsJvg; shshshfpa=17943c91-d534-104f-a035-6e1719740bb6-1525571955; shshshfpb=2f200f7c5265e4af999b95b20d90e6618559f7251020a80ea1aee61500; cn=0; 3AB9D23F7A4B3C9B=QFOFIDQSIC7TZDQ7U4RPNYNFQN7S26SFCQQGTC3YU5UZQJZUBNPEXMX7O3R7SIRBTTJ72AXC4S3IJ46ESBLTNHD37U; ipLoc-djd=19-1607-3638-3638.608841570; __jdu=930036140; user-key=31a7628c-a9b2-44b0-8147-f10a9e597d6f; areaId=19; __jdv=122270672|direct|-|none|-|1529893590075; PCSYCityID=25; mt_xid=V2_52007VwsQU1xaVVoaSClUA2YLEAdbWk5YSk9MQAA0BBZOVQ0ADwNLGlUAZwQXVQpaAlkvShhcDHsCFU5eXENaGkIZWg5nAyJQbVhiWR9BGlUNZwoWYl1dVF0%3D; __jdc=122270672; shshshfp=72ec41b59960ea9a26956307465948f6; rkv=V0700; __jda=122270672.930036140.-.1529979524.1529984840.85; __jdb=122270672.1.930036140|85.1529984840; shshshsID=f797fbad20f4e576e9c30d1c381ecbb1_1_1529984840145'
    			}
    	r = requests.get(url, headers=head)
    	# 指定编码方式,不然会出现乱码
    	r.encoding = 'utf-8'
    	html1 = etree.HTML(r.text)
    	# 定位到每一个商品标签li
    	datas = html1.xpath('//li[contains(@class,"gl-item")]')
    	# 将抓取的结果保存到本地CSV文件中
    	with open('JD_Phone.csv', 'a', newline='', encoding='utf-8')as f:
    		write = csv.writer(f)
    		for data in datas:
    			p_price = data.xpath('div/div[@class="p-price"]/strong/i/text()')
    			p_comment = data.xpath('div/div[5]/strong/a/text()')
    			p_name = data.xpath('div/div[@class="p-name p-name-type-2"]/a/em')
    			# 这个if判断用来处理那些价格可以动态切换的商品,比如上文提到的小米MIX2,他们的价格位置在属性中放了一个最低价
    			if len(p_price) == 0:
    				p_price = data.xpath('div/div[@class="p-price"]/strong/@data-price')
    				# xpath('string(.)')用来解析混夹在几个标签中的文本
    			write.writerow([p_name[0].xpath('string(.)'), p_price[0], p_comment[0]])
    	f.close()
    

    定义函数抓取每页后30条商品信息

    def crow_last(n):
    	# 获取当前的Unix时间戳,并且保留小数点后5位
    	a = time.time()
    	b = '%.5f' % a
    	url = 'https://search.jd.com/s_new.php?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E6%89%8B%E6%9C%BA&cid2=653&cid3=655&page=' + str(
    		2 * n) + '&s=' + str(48 * n - 20) + '&scrolling=y&log_id=' + str(b)
    	head = {
    		'authority': 'search.jd.com',
    		'cache-control': 'max-age=0',
    		'upgrade-insecure-requests': '1',
    		'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
    		'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    		'referer': 'https://www.jd.com/',
    		'accept-encoding': 'gzip, deflate, br',
    		'accept-language': 'zh-CN,zh;q=0.9',
    		'cookie': '__jdu=2047103149; shshshfpa=16ae8f53-5ae1-9de0-0ec7-d606fd429b8b-1571133416; shshshfpb=pYrZgLCdz5oFhuEIhY2v4Zw%3D%3D; qrsc=3; __jdv=76161171|baidu|-|organic|%25E4%25BA%25AC%25E4%25B8%259C|1590926787595; areaId=14; ipLoc-djd=14-1116-3433-0; rkv=V0500; UM_distinctid=1726aa0663582-03d3560bee40c-3a65420e-144000-1726aa06636233; TrackID=1Fkw1M1_Um8z4aZxzM88PaVrfa1NclrA5-Pp_oUv0QoGkQJsAuQx_mlrVK1jb-Hz3blG4lWBHe27qqvbdEe8mEpk3jKUxnzcTLHVVokp69gA; thor=3B3B94FCFFD97861EC4C84D7B4E9034099196D8E6BE2C0ED4523496131EFDDEEED2430BF573FA2C70A575F172968BC1D7BBD1E6A3D7102679C1ADEEEAA9FE084385F1BACFB82ADBB33C28559B3B8B60D0EFCC5D00234F976A6362CCB6DC3ED3817CFF1AAA7E47A87189B77281897EB3E44F2F3BF77CD5FB4D0153D05B69D0E9CD7968F837A3A84E42F389C3CC06275A13682D4F2460474EE85DC2A5907A93452; pinId=51UPJKKWueTfOBEKj6YZyw; pin=jd_UcBGwTpLaHLW; unick=jd_UcBGwTpLaHLW; ceshi3.com=000; _tp=yzNUSmC8aRtAFY8ILrHooA%3D%3D; _pst=jd_UcBGwTpLaHLW; shshshfp=9d38b151fe2b761e0c3a4fb78c195c2e; __jda=122270672.2047103149.1571133379.1586011436.1590926788.9; __jdb=122270672.8.2047103149|9.1590926788; __jdc=122270672; shshshsID=e446e3a630a5a9d9aeae1b61e2ce2641_6_1590927979367; CNZZDATA1277659945=2059356410-1590926797-https%253A%252F%252Fwww.jd.com%252F%7C1590927980; 3AB9D23F7A4B3C9B=7FX6VP23LCI5I6DXXAO64CHVLKIH6WDXMGJUDIUAB3PGKODGHZXKQUSISB62YVTTU2C7OEMI5KN4ZQSALB3UY6MC3I',
    	}
    	r = requests.get(url, headers=head)
    	r.encoding = 'utf-8'
    	html1 = etree.HTML(r.text)
    	datas = html1.xpath('//li[contains(@class,"gl-item")]')
    	with open('JD_Phone.csv', 'a', newline='', encoding='utf-8')as f:
    		write = csv.writer(f)
    		for data in datas:
    			p_price = data.xpath('div/div[@class="p-price"]/strong/i/text()')
    			p_comment = data.xpath('div/div[5]/strong/a/text()')
    			p_name = data.xpath('div/div[@class="p-name p-name-type-2"]/a/em')
    			if len(p_price) == 0:
    				p_price = data.xpath('div/div[@class="p-price"]/strong/@data-price')
    			write.writerow([p_name[0].xpath('string(.)'), p_price[0], p_comment[0]])
    	f.close()
    

    一样的方法绕过反爬虫机制
    image

    2.简易游戏开发

    吃豆人小游戏

    • 吃豆人是电子游戏历史上的经典街机游戏,由Namco公司的岩谷彻设计并由Midway Games在1980年发行。Pac-Man被认为是80年代最经典的街机游戏之一,游戏的主角小精灵的形象甚至被作为一种大众文化符号,或是此产业的代表形象。它的开发商Namco也把这个形象作为其吉祥物和公司的标帜,一直沿用至今。该游戏的背景以黑色为主。画面中,“Google”6个字母组成回廊似的迷宫画面,四个颜色分别为红、黄、蓝、绿的鬼面符号在迷宫中穿梭,似乎在寻找一个半开半合的黄色圆圈符号。当记者按动键盘上的方位键时,发现该黄色圆圈符号可以行走,并且可以吞吃迷宫路径上的小黄豆,但遇到鬼面符号时就要被吃掉。
    • 为方便开发,我将代码分成两个文件,分别是main.py和unit.py

    (1)main.py
    在其中主要实现了游戏窗口、参数等的初始化

    constant initialize

    FPS = 60
    BLOCK_SIZE = 24
    WIDTH = 29
    HEIGHT = 15
    WINDOW_WIDTH = WIDTH * BLOCK_SIZE
    WINDOW_HEIGHT = HEIGHT * BLOCK_SIZE
    MAP_NAME = "./material/map.maze"
    BGM_NAME = "./material/bgm.ogg"
    BLOCK_IMAGE = "./material/block.png"
    FOOD_IMAGE = "./material/food.png"
    GAMEOVER_IMAGE = "./material/gameover.png"
    SERVER_PORT = 30000
    ENEMY_COUNT = 4
    OX = 1
    OY = 1
    DELAY = 8
    

    pygame initialize

    pygame.init()
    display = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    clock = pygame.time.Clock()
    block_image = pygame.image.load(BLOCK_IMAGE)
    food_image = pygame.image.load(FOOD_IMAGE)
    gameover_image = pygame.image.load(GAMEOVER_IMAGE)
    bgm = pygame.mixer.music.load(BGM_NAME)
    scene = "game"
    unit_list = []
    game_map = []
    

    map initialize

    def load_map(filename):
    global game_map
    game_map.clear()
    file = open(filename, 'r')
    for line in file.readlines():
    	game_map.append(list(line.strip()))
    	pass
    pass
    

    set passport

    def through(position):
    	x = position[0]
    	y = position[1]
    	in_range = (x >= 0 and x < WIDTH) and (y >= 0 and y < HEIGHT)
    	in_space = (not game_map[y][x] == '1')
    	return (in_range and in_space)
    	pass
    

    以及对游戏是否结束的判断模块

    def gameover():
    	pygame.mixer.music.stop()
    	keys = pygame.key.get_pressed()
    	if keys[K_RETURN]:
    		initialize()
    		pass
    	display.fill((0, 0, 0))
    	x = (WINDOW_WIDTH-gameover_image.get_width())/2
    	y = (WINDOW_HEIGHT-gameover_image.get_height())/2
    	display.blit(gameover_image, (x, y))
    	pygame.display.update()
    	pass
    

    (2)unit.py
    在其中主要实现了敌人和玩家的创建,以及实现了游戏人物的移动

    class user(unit):
    	def __init__(self, x, y):
    		super(user, self).__init__(USER_IMAGE)
    		self.position = [x, y, x, y]
    		pass
    
    	def next(self, direction):
    		self.turn(direction)
    		self.ahead()
    		return (self.position[2], self.position[3])
    		pass
    
    class enemy(unit):
    	def __init__(self, id, x, y):
    		filename = ENEMY_IMAGE[id]
    		super(enemy, self).__init__(filename)
    		self.position = [x, y, x, y]
    		pass
    
    def track(self, user_pos):
    	rand_dir = [1,2,3,4]
    	self.turn(random.choice(rand_dir))
    	pass
    
    def clockwise(self):
    	self.turn(self.direction + 1)
    	pass
    

    游戏运行截图
    image

    image

    完整代码见码云链接
    视频演示已上传给小组长

    三、课程总结

    知识小结

    这一学期跟随着王老师学习了python,回顾所学,收获满满。下面对这学期所学Python知识做一个简单的小结。

    Python是一种高级动态、完全面向对象的语言,函数、模块、数字、字符串都是对象,并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。

    Python是一种计算机程序设计语言(解释型语言),具有代码少、简单、运行速度慢的特点。

    • 1、数据类型

      • 数字型:int、float、Boolean
      • 非数字型:字符串、列表、元组、字典
      • 可变类型:列表、字典
      • 不可变类型:数字、字符串、元组
      • 格式化字符串:两种写法
        我们上课主要学习了format字符串
        a、使用位置参数,{}的值对应填充 fromat 后面的变量 print("{}的级别是{}".format(score,grade)) 还可以使用 0、1 编号进行多个引用,0、1分别大表 format 后面变量的位置 print("{0}的级别是{1},分数是{0}".format(score,grade)) 甚至还可以使用参数列表,但是 format 后面要用 *list list=[score,grade] print("{0}的级别是{1},分数是{0}".format(*list))
        b、使用关键字参数:
        print("{score}的级别是{grade},分数是{score}".format(score=score,grade=grade)) 可以使用字典来传递关键字参数,但是要用 **hash hash = {'name':'hoho','age':18}
        'my name is {name},age is {age}'.format(//hash) 'my name is hoho,age is 18'
        精度与进制:变量后面加上冒号就可以指定输出形式
        '{0:.2f}'.format(1/3) '0.33' 千分位格式化: print("{1:,}".format(8,9))
    • 2、变量
      通常数据都是让变量来引用和保存的.
      变量是 python 中的重要概念,python 作为一门动态语言,就是体现在变量命名时不需要指定类型,而是可以指向任意类型的数据。变量命名也是有规则的,即必须是有数字、字母、下划线组成且不能数字开头,除此之外变量名还有一个写法上的通用原则:驼峰命名法

      • 小驼峰:首字母小写后面单词首字母大写
      • 大驼峰:每个单词的首字母都大写
        一般函数、变量名用小驼峰,模块和类名用大驼峰
    • 3、控制流
      python 程序运行都是从上到下依次运行,但是可以通过控制流来人为改变运行逻辑。

      • if :条件判断
      • while、for:两种循环

    而如果要在循环体内再次人为改变逻辑,就需要用到 breake、continue了,特别注意这两个破坏循环规则的语句都只作用在最近一层的 for、while 循环上。

    • 4.函数
      函数的出现是为了节省代码,减少冗余。
      def func(): print(' 调用了函数')
      匿名函数:
      常用来构建列表 list=[i for i in range(6)]
      还可以搭配 map 函数来使用, map(func,[1,2,3,4,5]) 会将列表中得数组依次传入 func 函数得到结果,得到一个map 值,再用 list 转换一下就可以得到一个列表
      函数参数(重点理解):
      函数的参数:形式参数的定义以及实际参数的写法

      • a、位置参数:实参+定义。就是实参会一一对应到形参上
        def func(num1) print(num1) func(10)
      • b、默认参数:定义。有默认值,如果传入了实参就用实参,定义的时候要在非默认参数后面:
        正确:def func(num1,num2=10)
        错误:def func(num1=10,num2)
      • c、关键字参数:实参。传入实际参数时,指定参数名字来传递数据,一般有一个实参用的是关键字参数,其余也要用,不然容易造成一个参数多个值的错误。 func(num1=12,num2=10) func(12,num2=10) d、元组可变参数:定义。可以接收任意数量的位置参数。使用 *args 来接收,会将接收到的值自动组包成一个元组赋给args,参数变成元组了 def func(num1,*args,name): print(num1) print(args) print(name) func(10,2,3,4,name='lan') 结果:这里是位置参数+元组可变参数 10 (2, 3, 4) lan e、字典可变参数:定义。可以接收多余的关键字参数,用 **kwargs 来接收。必须放到参数列表最后,不然报错。参数变成字典了 def func(num1=0,**kwargs): print(num1) print(kwargs) func(2,a=3,b=4) 结果: 2 {'a': 3, 'b': 4}
        注意: a、如果实参用了关键字参数,最好就都用关键字参数。
        字典可变参数必须要放到最后面(比默认参数还要后),元组可变没有顺序要求。
        左右:普通参数《==元组可变《==默认参数(应该靠后)《==字典可变(必须最后) 除了字典可变,其他顺序不是绝对,如果顺序有变化,实参中可以用关键字参数来调节 b、如果形参里面既有 默认参数,又有可变参数,那么要将默认参数放到最后面,并且赋值时必须要用关键字参数。这也符合默认参数放到非默认参数后面的原则 def func(num1=0,*args): print(num1) print(args) # 像这里本来时像把 2,3,4 都给 args ,可以由于位置参数的原因,最终是num1=2,rags=(3,4)) func(2,3,4) 变成如下就好了:
        def func(*args,num1=0): func(2,3,4,num1=10)
    • 5、文件操作
      学习了最基本的文件读写操作,在实验三中的socket通信中有所体现

    • 6、网络爬虫
      在最后几节课中,我学习了request等爬虫需要用到的库中相关函数的使用,并动手实践爬虫了豆瓣网、疫情动态网,熟悉了爬虫的一般方法。

    感想与建议

    • 在这一学期课程中,我对python这门语言有了更加深入的了解。python的库十分丰富,功能强大,品类繁多。虽然开始课程的知识点密度没有想象中的大,但正是这段时间我不断在实践中巩固了python基础,这才让我在课程的后半阶段中能够顺利跟上老师的脚步,实现python编程能力的提升。通过这么长时间对python这一语言的学习和实践,我深切地感受到了python的优点。

    • 至于说到建议,我觉得课程上可以讲解更多的实例,让我们在动手实现各种各样的案例中学习python编程,也希望今后课程中能够讲到大数据分析、人工智能、神经网络等当下热门的内容。

    • 总而言之,在王老师的指导下,我这个学期进行了很多的编程实践,虽然没有完成很庞大的项目,但是在课程学习的过程中,我掌握了许许多多的知识,收获非常大,也体会到了python写脚本、做项目的快乐。对于我来说,能够亲手实现一些以前从来没有编写过的程序确实是满满的成就感。最后,希望自己能够在以后的时间中,继续学习python,亲手写出更多有意思的程序,在python学习之路上继续前行。

    参考资料

  • 相关阅读:
    linux内核的若干问题
    shell(四)--turboastat
    Mac系统维护
    花卉养殖(1) 黄叶
    你就是佛(1)- 本体、开悟与思想
    linux 工具(2)----- crontab定时任务管理
    vim (四) 使用技巧
    linux kernel __init和__exit宏的作用
    优秀的网站
    Mac OSX 快捷键&命令行
  • 原文地址:https://www.cnblogs.com/20191218tangqiheng/p/14929060.html
Copyright © 2020-2023  润新知