首页
关于
友链
留言
Search
1
安装Docker Desktop报错WSL 2 installation is incomplete
76 阅读
2
震惊!杭州应届生工作免费领2w元
31 阅读
3
我的世界紫禁之巅纯净生存服务器
25 阅读
4
python3网络爬虫开发实战pdf
23 阅读
5
火车头采集问题:Void Proc(System.Net.HttpWebRequest)
20 阅读
技术分享
日常学习
我的世界
Search
标签搜索
python
博客
javascript
ce
web
织梦
html
按键精灵
php
游戏
css
typescript
jquery
日常
数据库
vue
ubuntu
Datehoer
累计撰写
179
篇文章
累计收到
10
条评论
首页
栏目
技术分享
日常学习
我的世界
页面
关于
友链
留言
搜索到
138
篇与
技术分享
的结果
2020-11-17
爬虫基础解析--了解爬虫基础
这篇文章讲一下爬虫的基础,今天刚学到的,现学现卖啦!爬虫,顾名思义,就是爬来爬去的虫子,但是它并不是在现实中爬来爬去,而是在网络中爬来爬去。它通过模拟人类浏览的动作在各大网站进行溜达,如果遇到喜欢的他就把这个内容给记录下来,储存到本地或者别的地方。爬虫:就是把对网页进行爬取然后把其中需要的数据提取出来,之后进行保存的一些列自动化操作,而提取信息最常用的方法就是正则表达式。正则表达式,也称为正则表达式,通常用于检索和替换符合特定模式(规则)的文本。正则表达式是字符串运算的逻辑公式,即“正则字符串”是由预先定义的一些特定字符和这些特定字符的组合构成的。这个“常规字符串”用于表示字符串的过滤逻辑。不过现在根据需求不同,也有一些其他的爬取方法,比如说根据网页的属性进行爬取,css选择器,xpath等。爬虫主要是代替手工来提取数据,在爬取过程中可以进行各种异常处理,错误重试等等一系列操作,保障爬取的高效进行,不过其实之所以爬虫高效是因为你人类终究会烦躁,遇到错误等等还有可能需要现查,而你爬虫只需要提前设置好了,遇到各个问题就会有相应的解决方法提供。爬虫爬取的数据大多数是html代码,也有的是json数据,亦或者是二进制数据(音频,图片等)也有css,js数据。只要网页是基于http协议和https协议的,爬虫就可以进行爬取。不过现在有的网站为了防止爬取或者为了把网页做的更好,会将网页通过JavaScript渲染出来,而这就加大了爬虫爬取的难度。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h1>示例</h1> <script src="js/script.js" type="text/javascript"></script> </body> </html>类似于上面的内容,只有简单的html框架,详细的内容都是通过js调用来进行渲染的,而我们爬取的话源代码与浏览器显示的是不同的,http请求库得到的源代码跟浏览器的源代码不一样,而这就需要更换其他方法来进行爬取了,通过分析后台或使用selenium等库来进行模拟爬取。毕竟你有了爬虫,就会有反爬虫的技术,不断的切磋,不断地发展,到底是道高一尺还是魔高一丈呢,还是需要看爬取者和网站管理员的技术谁高谁低了。
2020年11月17日
2 阅读
0 评论
0 点赞
2020-11-17
网站索引量暴跌
目前是23号,我的百度站长索引量内容只到16号,并没有更新后面的数据,不知道是因为问题还没有修复,还是因为什么,不过当时18号的时候,百度就发公告了您好,近日搜索资源平台【索引量】工具,由于工具计算系统不稳定导致数据异常,当前问题已紧急修复,索引量数据重新上线,详情请参考请点击 。出现了,它出现了,百度居然把索引量调回了15号的,非常神奇,吓我一跳,我就觉得我api提交3000份没啥问题,哈哈。今天在打开百度站长工具的时候,看到了我可怜巴巴的索引量直接变成0了,我就觉得今天是一个不寻常的日子。虽然我觉得问题大概是我在昨天出现了一波操作失误,主动提交数直接涨到了3000,今天一看的时候把我吓到了。但是我后来看百度的站长论坛里,发现许许多多的网站的索引量都变少了,人家是几万几万的减,几百万的索引量都减半了,而我这才3条索引量,只是毛毛雨罢了。我目前看到的,大多数的网站都降了,而且大多数是一半一半的掉,我这个一下全掉就有点奇怪了,哈哈。不过其实只要保证网站的质量,发布优质内容还是可以的。引用一个大哥的话 刚才看到跌了100多万,心里暗暗叫到“不好~~~~~~~~~~” 正准备删库走人的时候,看到了楼主的贴子,心里顿时豁然了,楼主的贴子好比一盏明灯! 今天不用走人了,还可以多领一天鸡腿~~~~~~~~~ 本来可能要有一大堆的人今天要删库跑路了,没想到发现大家都这样,而且我的掉的还算少的,那么要加鸡腿喽!版权:本文由Datehoer原创,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接本文链接:https://zjzdmc.top/jsfx/51.html。
2020年11月17日
4 阅读
0 评论
0 点赞
2020-11-16
安装Docker Desktop报错WSL 2 installation is incomplete
在看《python3网络爬虫开发实战》的时候,安装开发环境时,遇到了一个小问题,但是呢百度上面的回答大多不怎么样,不过没想到自己随便一试就把解决办法试出来了。安装Docker Desktop时,出现了 这个报错,具体原因是因为windows系统下的Linux内核的版本有点小低,我们只需要单击那个蓝色的链接,下载对应的linux内核更新包,然后更新一下即可!蓝色链接:单击即可,然后按照网页内容进行操作就行了。
2020年11月16日
76 阅读
0 评论
0 点赞
2020-11-15
python3网络爬虫开发实战pdf
看过前面的文章就能知道,我最近在学习爬虫,虽然说是这个没啥用,以后用处不大,但是确实有点想要学一下。然后呢,咨询了一些大牛,并且参考了许多的回答,感觉《 python3网络爬虫开发实战 》挺不错的,但是呢价格确实有点小贵,于是准备在网上找一下pdf版先看看,如果可以的话再买实体书,毕竟不是二三十的书,但是呢,找到的资源全部都是需要付费购买的,感觉确实有点搞笑啊,拿别人的成果来进行付费购买,属实牛皮!于是呢,我就准备放一下免费资源给大家,不过呢,看一下大体内容如果觉得可以的话还是请支持一下正版!我现在已经买了,你呢? 点击图片获得下载链接!
2020年11月15日
23 阅读
0 评论
0 点赞
2020-11-14
python 爬虫入门之requests-html
其实本来应该早一点发的,但是我用织梦后台编辑文章的时候,不小心点了网页的x号,于是乎,内容白写了,然后我又开始重新写了。requests库,是一个第三方的Python库,用来模拟发送HTTP请求。它通常用于爬虫或接口的测试。与urllib等其他的系统库相比,虽然他们的功能相似,但是requests相对来说更简单、方便和高效。首先我们先把这个requests-html安装一下进入运行框然后输入 pip3 install requests-html 即可安装成功,在之后我们把该库导入即可 import requests_html 接下来准备了一个小例子给大家,本来其实每句话都有分析的,但是由于是第二遍写,就不那么麻烦了 import requests_html #导入requests-html库 session = requests_html.HTMLSession() #创建一个session的变量,用来取代requests_html.HTMLSession()要不之后字太多而纸样只需要操作session res = session.get("https://zjzdmc.top/") #get一下网址,这里我们用博客主页做演示 res.encoding = "utf-8" #获取的编码格式 print(res.text) #输出获取的内容 最简单的一种方法。之后我们来介绍一下其他的方法,也就是requests-html的进阶。获取链接: print(res.html.absolute_links) 这个就是获取链接的方式,绝对路径,这样就会直接获取完整的链接'https://zjzdmc.top/wdsj/'而如果直接获取链接呢? print(res.html.links) '/wdsj/2020/1111/42.html'则会出现上面这样不完整的链接,各有各的用处吧,不过大多数还是要加一下绝对路径的链接的。XPATH:这个的抓取我们看一下动图获取的内容为/html/body/article这个 print(res.html.xpath("/html/body/article", first=True).text) 这个就是把该 xpath代表的内容输出出来的代码。而xpath有4个参数: selector,要用的XPATH选择器; clean,布尔值,如果为真会忽略HTML中style和script标签造成的影响(原文是sanitize,大概这么理解); first,布尔值,如果为真会返回第一个元素,否则会返回满足条件的元素列表; _encoding,编码格式。 然后我们还有html+css获取的方法html+css:还是以博客的主页为例,我们要获取头部标签内的内容,而我们div里有一个class为header的标签,我们就获取他的内容吧。hc = res.html.find("div.header", first=True) print(hc.text)只要写出该内容的标签传递关系即可获取内容主页 技术分享 日常学习 法制专栏 我的世界 关于我 检索标题 智能模糊 搜索 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https'){ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else{ bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); (function(){ var src = "https://jspassport.ssl.qhimg.com/11.0.1.js?d182b3f28525f2db83acfaaf6e696dba"; document.write('<script src="' + src + '" id="sozz"><\/script>'); })(); 这就是具体的获取内容了,相应的,具体你需要什么内容需要通过属性来进行判断。print(hc.search("主{}")[0])比如说这个,这个就是查询内容了,搜索之前获取的div.header里有没有以主为开头的内容,然后返回获取的值。再比如说还有许多的方法,就不一一在此列出了,其余的我们且听下回分晓!如果有什么问题可以发送到下面的评论区,我会在看到的时候进行解答。
2020年11月14日
5 阅读
0 评论
0 点赞
2020-11-13
个人博客模板分享
一些比较精品的个人模板推荐,大多数都是织梦后台!解压即用,解压密码内置!天翼云
2020年11月13日
5 阅读
0 评论
0 点赞
2020-11-12
python 外星人入侵 完整版
差不多用了三天的空闲时间,把这个案例看完了一遍,并且实际操作了一下,其实难度确实不高,很适合我们这样的新人去操作。不过其实遇到了许多的问题,但大多都是我的问题,做的我是心态崩了。今天最后做play按钮的时候,怎么也不出效果,把game_active 改为False就显示黑屏,而换成True显示内容但是没啥卵用,因为不是静态的。当时是真的不想做了,因为确实没有啥错误,出去吃了个饭,再仔细一看发现我是真的蠢! while True: # 监视鼠标和键盘事件 gf.check_events(ai_settings, screen, stats, board, play_button, ship, aliens, bullets) if stats.game_active: ship.update() bullets.update() gf.update_bullets(ai_settings, screen, stats, board, ship, aliens, bullets) gf.update_aliens(ai_settings, screen, stats, board, ship, aliens, bullets) gf.update_screen(ai_settings, screen, stats, board, ship, aliens, bullets, play_button) 这一段,最后的gf.update_screen,应该是再if外的,因为他是做出那个静态效果的,但是我当时把他放到了if里,所以改成false时,显示黑屏,我当时真的找了半天,因为他这个如果你没改false的话是没有任何问题出现的,最后随便一看,发现了这个错误,把我气的。还有一些非常蠢的错误,基本上全是自己的失误吧,哎,说多了都是泪。其实很重要的一个模块就是pygame.sprites毕竟你要修改游戏要进行交互等等吧,很重要。---->《python sprites介绍》不得不说,细节决定成败,这句话非常有道理!我就把外星人,计分板和按钮的py文件发一下源代码,其余的还是改成附件上传吧,毕竟有点小多。计分板的,scoreboard.py import pygame.font from pygame.sprite import Group from ship import Ship class Scoreboard(): """显示得分信息的类""" def __init__(self, ai_settings, screen, stats): self.screen =screen self.screen_rect = screen.get_rect() self.ai_settings = ai_settings self.stats = stats self.text_color = (50, 50, 50) self.font = pygame.font.SysFont(None, 48) # 初始化得分图像 self.prep_score() self.prep_high_score() self.prep_level() self.prep_ships() def prep_ships(self): self.ships = Group() for ship_number in range(self.stats.ships_left): ship = Ship(self.ai_settings, self.screen) ship.rect.x = 10 + ship_number * ship.rect.width ship.rect.y = 10 self.ships.add(ship) def prep_high_score(self): high_score = int(round(self.stats.high_score, -1)) high_score_str = "{:,}".format(high_score) self.high_score_image = self.font.render(high_score_str, True, self.text_color, self.ai_settings.bg_color) # 将最高得分放在屏幕顶部中央 self.high_score_rect = self.high_score_image.get_rect() self.high_score_rect.centerx = self.screen_rect.centerx self.high_score_rect.top = self.score_rect.top def prep_level(self): self.level_image = self.font.render(str(self.stats.level), True, self.text_color, self.ai_settings.bg_color) self.level_rect = self.level_image.get_rect() self.level_rect.right = self.score_rect.right self.level_rect.top = self.score_rect.bottom + 10 def prep_score(self): """将得分转化为图像""" rounded_score = int(round(self.stats.score, -1)) score_str = "{:,}".format(rounded_score) self.score_image = self.font.render(score_str, True, self.text_color, self.ai_settings.bg_color) # 将得分放到右上角 self.score_rect = self.score_image.get_rect() self.score_rect.right =self.screen_rect.right -20 self.score_rect.top = 20 def show_score(self): """在屏幕上显示得分""" self.screen.blit(self.score_image, self.score_rect) self.screen.blit(self.high_score_image, self.high_score_rect) self.screen.blit(self.level_image, self.level_rect) # 绘制飞船 self.ships.draw(self.screen) 外星人的,alien.py import pygame from pygame.sprite import Sprite class Alien(Sprite): def __init__(self, ai_settings, screen): """初始化外星人起始位置""" super(Alien, self).__init__() self.ai_settings = ai_settings self.screen = screen # 加载外星人图像,并设置其rect属性 self.image = pygame.image.load("images/alien.bmp") self.rect = self.image.get_rect() # self.screen_rect = screen.get_rect() # 每个外星人都要在屏幕的上面出现 self.rect.x = self.rect.width self.rect.y = self.rect.height # 储存每个外星人的位置 self.x = float(self.rect.x) def blitme(self): self.screen.blit(self.image, self.rect) def check_edges(self): """如果外星人位于屏幕边缘,就返回true""" screen_rect = self.screen.get_rect() if self.rect.right >= screen_rect.right: return True elif self.rect.left <= 0: return True def update(self): """向右移动外星人""" self.x += self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction self.rect.x = self.x 按钮,button.py import pygame.font class Button(): def __init__(self, ai_settings, screen, msg): self.screen = screen self.screen_rect = screen.get_rect() self.width, self.height = 200, 50 self.button_color = (0, 255, 0) self.text_color = (255, 255, 255) self.font = pygame.font.SysFont(None, 48) self.rect = pygame.Rect(0, 0, self.width, self.height) self.rect.center = self.screen_rect.center self.prep_msg(msg) def prep_msg(self, msg): self.msg_image = self.font.render(msg, True, self.text_color, self.button_color) self.msg_image_rect = self.msg_image.get_rect() self.msg_image_rect.center = self.rect.center def draw_button(self): self.screen.fill(self.button_color, self.rect) self.screen.blit(self.msg_image, self.msg_image_rect) 其余的下载链接--》 天翼云有什么问题可以在下面的评论区发送,我看到后会在第一时间解答!
2020年11月12日
3 阅读
0 评论
0 点赞
2020-11-12
php 表单提交
首先呢,本地演示需要开启本地服务器,使用 phpstudy 或者 apache 或者别的都可以。然后修改一下host,使得不需要输入localhost就能访问本地网站。说一下流程就是你在html页面创建一个<form>然后设置action为你的php文件名,之后method选择post/get都可以。接受数据使用的就是$_POST/$_GET,不过其实还需要加上你的name,具体代码实现可以看下面的例子html代码< form action = "444.php" method = "post" > < input type = "text" name = "nl" > < input type = "submit" value = "提交" > </ form >php代码<?php $age = $_POST [ "nl" ]; if ( $age > 18 ){ echo "你要对自己的行为负责" ; } ? >一个非常简单的例子,判断年龄是否大于18岁,name就相当于你的标志,这样你后面的$_POST[]里[]才好确认自己接受的是哪个的数据。下面说一下$_GET和$_POST的区别$_GET变量是一个包含名称[name]和值[value]的数组(这些名称和值是通过HTTP GET方法发送的,且都可以利用)。$_GET变量使用“method=get”来获取表单信息。通过GET方法发送的信息是可见的(它将显示在浏览器的地址栏里),并且它有长度限制(信息的总长度不能超过100个字符[character])。$_POST变量是一个包含名称[name]何值[value]的数组(这些名称和值是通过HTTP POST方法发送的,且都可以利用)$_POST变量使用“method=POST”来获取表单信息。通过POST方法发送的信息是不可见的,并且它没有关于信息长度的限制。其中一个区别就是一个相对安全一个相对不安全,之前看到了一个比喻感觉非常形象:在万维网的世界中,TCP就像是一辆汽车,我们通过TCP来运输数据,它非常可靠,从来不会发生丢件少件的现象。但是如果道路上跑的全都是看起来一模一样的汽车,那这个世界貌似是一团混乱,送加急的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET, POST, PUT, DELETE等等,HTTP规定,当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。上面的比喻非常的形象,毕竟一个放在头上一个放在车厢,谁安全谁不安全一眼就能看出。其次还有一个区别就是 GET只会产生一个TCP数据包,而POST则会产生两个TCP数据包。不过其实这也不能说明哪个方法好一些,如果传输过程稳定,那么其实get方法比较好,毕竟一次就传输过去了,而post要先发送一个请求,相当与我运输货物前,我先去跟你打个招呼说“你要的xx一会我就要运过来了,记得收一下”然后再去发送。具体使用需要看自身或客户需求,毕竟虽然感觉作用类似但实际上内在大多不同,GET与POST都有自己的语义,不能随便混用。
2020年11月12日
2 阅读
0 评论
0 点赞
2020-11-11
python sprites介绍
虽然在《python从入门到实践》项目实战中,运用到了pygame.sprites但是并没有介绍这个是什么东西,只是简单的引用外加调用。相信有许多人像我一样,并不知道这个到底是啥意思,有啥作用。下面让我来介绍一下这个在pygame中挺重要的角色。 “sprite”,中文翻译“精灵”,一般是指游戏动画中独立移动的一个画面元素,在pygame中可以是一个带有图像(Surface)和大小位置(Rect)的对象。精灵特别适合在Python语言中使用。1、角色可直接拖动(compound造型不支持)。2、提供像Scratch中的三种旋转模式。精灵对象的_rotatemode属性值为0,代表可360度旋转,为1时代表可左右翻转,为2时角色不会旋转。3、rotatemode:返回或设置旋转模式。4、addx:x坐标增加。5、addy:y坐标增加。6、scale:缩放,只有一个参数。7、gotorandom:到随机位置。8、heading:重定义了这个方法,不带参数能获取当前朝向。带参数参让角色朝向某对象或坐标。9、show:显示对象,带参数时让角色显示一定的时间后又会隐藏,异步执行。10、hide:隐藏对象,带参数时让角色隐藏一定的时间后又显示,异步执行。11、mouse_pos:获取鼠标指针坐标。12、move:移动水平dx距离和垂直dy距离。13、collide:和另一个角色或图章的碰撞方法,采用的是矩形碰撞,可以有scale参数,表示缩放绑定盒子,如scale=0.5时,绑定盒宽高各缩一半。14、collidemouse:碰到鼠标指针。15、collide_edge:碰到边缘检测。16、bounce_on_edge:碰到边缘就反弹,适合于用fd命令让角色前进后再使用。17、bbox:获取角色绑定盒,也可获取图章的绑定盒。18、randomcolor:随机颜色,较鲜艳。19、randomheading:随机方向。20、remove:移除方法,把自己从屏幕的_turtles列表中删除,并根据item号删除自己在画布上的形状,清除说话泡泡对象。21、stamp:重定义了Turtle类的图章方法,新增的参数可以让图章在一定时间后自动被清除,异步执行。22、stampmove:根据图章编号水平和垂直移动图章。23、stampgoto:移动图章编号到指定坐标,暂不支持复合图形的图章,它们的图章编号是一个元组。24、play:播放方法,目前只支持播放无损压缩的wav音频文件,支持显示歌词。25、setalpha:设置透明度方法。参数为从0到255的数值。0代表完全透明,255代表不透明,128代表半透明。对于polygon和compound造型来说,0代表透明,非0代表不透明。对于image来说,设置角色的透明度从0到255的值就会产生从透明到不透明的渐变效果。26、getalpha:得到透明度,从0到255的整数。27、set_tag:设置角色的标签。它是一个字符串,用于分组。28、get_tag:获取角色的标签。29、say:说话方法,会显示气泡。默认时间为2秒,默认阻塞进程。30、saycolor:返回或设置说话的字的颜色。31、saybordercolor:返回或设置说话泡泡的边框颜色。32、write:重定义写方法,增加angle参数,可以写斜字,默认为黑体,12号。33、reborn:“重生”方法,让角色隐藏后在另一坐标重新显示。复用角色之用,可加delay参数,意为在一定的时间后才显示,异步执行。34、nextcostume:下一个造型,别名是nextshape。35、previouscostume:上一个造型,别名是previousshape。36、costumeindex:指定造型编号,别名是shapeindex。37、update:重绘角色。具体的功能就是上面这37个列出的功能了。 具体使用的话,看看下面的这个例子:def check_fleet_edges(ai_settings, aliens): """有外星人到达边缘时采取相应的措施""" for alien in aliens.sprites(): if alien.check_edges(): change_fleet_direction(ai_settings, aliens) break def change_fleet_direction(ai_settings, aliens): """将整群外星人下移,并改变它们的方向""" for alien in aliens.sprites(): alien.rect.y += ai_settings.fleet_drop_speed ai_settings.fleet_direction *= -1 def update_aliens(ai_settings, aliens): """检查是否有外星人位于屏幕边缘,并更新整群外星人的位置""" check_fleet_edges(ai_settings, aliens) aliens.update()这个例子呢,就是外星人大战飞船的进阶版,生成外星人,然后根据外星人的移动来进行改变他们的方向。在check_fleet_edges()中,我们遍历外星人群,并对其中的每个外星人调用check_edges()。如果check_edges()返回True,我们就知道相应的外星人位于屏幕边缘,需要改变外星人群的方向,因此我们调用change_fleet_direction()并退出循环。在change_fleet_direction()中,我们遍历所有外星人,将每个外星人下移fleet_drop_speed设置的值;然后,将fleet_direction的值修改为其当前值与-1的乘积。其实sprite相当于一个便捷的类让我们的图像来与其他的进行交互,不过其实具体的使用方法还是要看官方文档的,官方文档入口。具体有什么问题可以发送到评论区,有什么难题我们可以一起讨论。
2020年11月11日
5 阅读
0 评论
0 点赞
2020-11-08
python 外星人入侵小游戏之飞船
本来其实这篇文章我已经有思路了,并且其实已经写了一些了,但是因为有一些事情要去做,然后忘记这边还写得文章了,没保存直接关闭了。所以现在是我重新写的了!最近我是在看《python从入门到实践》,看的比较快,已经到项目部分了,开始做飞船大战外星人这个基本上入门必学的案例了,但是还是遇到了许多的问题,不过幸好基本上全部解决了了。其实对编程最大的挑战,就是仔细。这个东西确实,有的时候感觉就是控制不住自己,不是多敲了就是少敲了,下面先分析一下会出现什么样的问题。首先呢其实就是英文大小写问题,还有加不加s,有的时候你前面定义的是有s的,但是后来下面调用的时候忘记了,或者前面没有s,后面加了。再有就是符号问题,我发现我写python很爱写;搞得我很难受,用pycharm一直有波浪线出现。然后再就是其实真的,一些简单的小程序写上一个文档就好了,文档太多调用很麻烦的!不过说实在的,分的多了,找起来修改很容易,并且其实未来进行编程的时候,大多都不是小程序,还是需要重构一下代码的。不过其实,可以先把想要重构的先写出来,然后再找到合适的地方把它放进去,不是创建一个.py就是创建一个def,反正就是要把它放起来,让主文件空空荡荡最好!我一般就是错名字,错参数!很难受的,有的找起来非常费劲! super(Bullet,self).__init__() 比如说这一段,给继承的参数,容易出错。再比如说一些位置,不要理所应当,我今天把左右移动调成上下移动,一开始是我确实以为是up和down,没想到实际上却是top和bottom,虽然有的时候pycharm没有提示,但是大多数没提示都是错误的。下面上一下代码,把所有文件放在同一目录下即可,当然图片记得放好或者修改一下。主文件:import pygame from setting import Settings from ship import Ship import game_functions as gf from pygame.sprite import Group def run_game(): #初始化游戏并且创建一个屏幕对象 pygame.init() #初始化背景属性 ai_settings = Settings() #使类s etting里的内容直接被调用 screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("aa") #窗口名字 #创建飞船 ship = Ship(ai_settings, screen) #创建储存子弹的编组 bullets = Group() #开始游戏的主循环 while True: #监视鼠标和键盘事件 gf.check_events(ai_settings, screen, ship, bullets) ship.update() bullets.update() gf.update_bullets(bullets) gf.update_screen(ai_settings, screen, ship, bullets) run_game()game_functions.pyimport sys import pygame from bullet import Bullet def check_keydown_events(event, ai_settings, screen, ship, bullets): """相应按下""" if event.key == pygame.K_RIGHT: ship.moving_right = True elif event.key == pygame.K_LEFT: ship.moving_left = True elif event.key == pygame.K_SPACE: fire_bullet(ai_settings, screen, ship, bullets) def fire_bullet(ai_settings, screen, ship, bullets): # 创建一个子弹并将它加入编组bullets if len(bullets) < ai_settings.bullet_allowed: # 判断现存子弹数量是否小于设定值 new_bullet = Bullet(ai_settings, screen, ship) bullets.add(new_bullet) def check_keyup_events(event, ship): """相应松开""" if event.key == pygame.K_RIGHT: ship.moving_right = False elif event.key == pygame.K_LEFT: ship.moving_left = False def check_events(ai_settings, screen, ship, bullets): """响应按键和鼠标事件""" for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: check_keydown_events(event, ai_settings, screen, ship, bullets) #先定义再调用 elif event.type == pygame.KEYUP: check_keyup_events(event, ship) def update_screen(ai_settings, screen, ship, bullets): """更新数据""" screen.fill(ai_settings.bg_color) #绘制所有子弹 for bullets in bullets.sprites(): bullets.draw_bullet() ship.blitme() # 让最近绘制的屏幕可见 pygame.display.flip() def update_bullets(bullets): """更新子弹位置,删除消失的子弹""" #更新子弹位置 bullets.update() #删除消失的子弹 for bullet in bullets.copy(): if bullet.rect.bottom <0: bullets.remove(bullet) # print(len(bullets)) #检测子弹是否消失ship.pyimport pygame class Ship(): def __init__(self, ai_settings, screen): """初始化飞船位置""" self.screen = screen self.ai_settings = ai_settings #加载飞船图像并获取其外接矩形 self.image =pygame.image.load("images/ship.bmp") self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() #将每艘新飞船放在屏幕底部中央 self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom #在飞船的属性center中储存小数值 self.center = float(self.rect.centerx) #移动标志 self.moving_right = False self.moving_left = False def update(self): """根据移动标志调整位置""" # 更新飞船的center值,而不是rect if self.moving_right and self.rect.right < self.screen_rect.right: self.center += self.ai_settings.ship_speed_factor if self.moving_left and self.rect.left > 0: self.center -= self.ai_settings.ship_speed_factor # 根据self.center更新rect对象 self.rect.centerx = self.center def blitme(self): """在指定位置绘制飞船""" self.screen.blit(self.image, self.rect)bullet.pyimport pygame from pygame.sprite import Sprite class Bullet(Sprite): """一个对飞船发射的子弹进行管理的类""" def __init__(self, ai_settings, screen, ship): """在飞船所处位置创建一个子弹""" super(Bullet,self).__init__() # super().__init__() 3 self.screen = screen # 在(0,0)处创建一个表示子弹的矩形,再将位置进行转移(设置成改在的位置) self.rect = pygame.Rect(0, 0, ai_settings.bullet_width, ai_settings.bullet_height) self.rect.centerx = ship.rect.centerx self.rect.top = ship.rect.top # 储存用小数表示的子弹位置 self.y = float(self.rect.y) self.color = ai_settings.bullet_color self.speed_factor = ai_settings.bullet_speed_factor def update(self): """向上移动子弹""" #更新子弹位置的小数值 self.y -= self.speed_factor #更新子弹的位置 self.rect.y = self.y def draw_bullet(self): """在屏幕上绘制子弹""" pygame.draw.rect(self.screen, self.color, self.rect)setting.pyclass Settings(): """储存外星人大战的所有设置""" def __init__(self): """初始化游戏的设置""" # 屏幕设置 self.screen_width = 1200 self.screen_height = 800 self.bg_color = (230, 230, 230) #飞船的设置 self.ship_speed_factor = 1.5 # 子弹设置 self.bullet_speed_factor = 1 self.bullet_width = 3 self.bullet_height = 15 self.bullet_color = 60, 60, 60 self.bullet_allowed = 3效果图我就不放了,反正还可以吧,就这样!
2020年11月08日
2 阅读
0 评论
0 点赞
2020-11-05
python argument 1 must be 2-item sequence, not int
在继续python学习的时候,发现报错了!出现错误argument 1 must be 2-item sequence, not int,明明我是照着书打的,为什么会出现错误呢。import pygameimport sys from setting import Settings def run_game(): #初始化游戏并且创建一个屏幕对象 pygame.init() #初始化背景属性 ai_settings = Settings() #使类setting里的内容直接被调用 # screen = pygame.display.set_mode((1200, 800)) #定义窗口大小 screen = pygame.display.set_mode(ai_settings.screen_width, ai_settings.screen_height) pygame.display.set_caption("Alien Invasion") #窗口名字 # 设置背景颜色 # bg_color = (230, 230, 230) #开始游戏的主循环 while True: #监视鼠标和键盘事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.fill(ai_settings.bg_color) #将颜色填充进去 #让最近绘制的屏幕可见 pygame.display.flip() run_game()查看代码,发现最上面的引用类出现红色波浪线,但是原因应该不是这个,因为他并没有报出错误。继续查看Traceback (most recent call last): File "D:/Python-work/pythonrumen/2020/11/newtravel.py", line 22, in <module> run_game() File "D:/Python-work/pythonrumen/2020/11/newtravel.py", line 9, in run_game screen = pygame.display.set_mode(ai_settings.screen_width, ai_settings.screen_height)问题出现在第9和22行,第22行是启动游戏,无所谓,那么问题就在第9行了,screen = pygame.display.set_mode(ai_settings.screen_width, ai_settings.screen_height)仔细对比发现,我的数据少了一个圆括号,通过百度查询,得知报错为参数为元组不是int类型,所以给参数添加一个圆括号即可。import pygame import sys from setting import Settings def run_game(): #初始化游戏并且创建一个屏幕对象 pygame.init() #初始化背景属性 ai_settings = Settings() #使类setting里的内容直接被调用 # screen = pygame.display.set_mode((1200, 800)) #定义窗口大小 screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("Alien Invasion") #窗口名字 # 设置背景颜色 # bg_color = (230, 230, 230) #开始游戏的主循环 while True: #监视鼠标和键盘事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.fill(ai_settings.bg_color) #将颜色填充进去 #让最近绘制的屏幕可见 pygame.display.flip() run_game()运行成功。通过以上问题得知,原来有许多的报错其实是因为自己的不仔细,不是漏符号了,就是中英文错误,需要养成一个良好的编写习惯!
2020年11月05日
8 阅读
0 评论
0 点赞
2020-11-02
python 列表循环后输出结果有个none
class Restaurant(): def __init__(self, restaurant_name, cuisine_type): self.restaurant_name = restaurant_name self.cuisine_type = cuisine_type def describe_restaurant(self): return self.restaurant_name+"is a good restaurant.Its cuisine is"+self.cuisine_type def open_restaurant(self): return self.restaurant_name+"now is work" class IceCreamStand(Restaurant): def __init__(self, restaurant_name, cuisine_type,*flavors): super().__init__(restaurant_name,cuisine_type) self.flavors = flavors def icelist(self): for sweet in self.flavors: print(self.restaurant_name+sweet) return '' ice = IceCreamStand("sweeet","冰淇凌",'aa','bb') print(ice.icelist()) 在做python练习题的时候,遍历列表后发现输出结果带个none,非常烦躁。查了许多方法,发现是因为有return返回值,如果不设置的话就会返回none,最直接的办法就是像上面一样,设置为空的字符串。但是感觉很难受,所以我把for循环去掉,然后把return修改了一下 return self.restaurant_name+str(self.flavors) 改成直接返回值了,而不是先遍历出数据再返回值,不过感觉还是非常不舒服,但是目前来说没有找到更好的方法了,等想到更好的方法回来修改一下!差不多10分钟,我就又回来了,首先呢,self.flavors是一个元组,我之前一直以为是列表的。说下方法,就是把元组给遍历出来,然后把他的值储存起来就可以了。b = "" for i in range(0,len(self.flavors)): c = self.flavors[i] b = b + c if i != len(self.flavors) -1: b = b+"," return b #修改return为self.restaurant_name+b即可元组的读取还是一样的都是xxx[?]进行读取,然后取一个变量等于这个值不断向上增加即可,后面的那个if是判断增加逗号的,显得更好看,为什么要加if是因为如果不加的话,那最后一个值也会加上,sweetaa,bb,输出这样的结果,非常难看,而如果加上判断sweetaa,bb输出这样的结果,还可以接受的,哈哈。有简单的方法可以在底下评论指出!
2020年11月02日
4 阅读
0 评论
0 点赞
1
...
9
10
11
12