page 指令可以定义下面这些大小写敏感的属性(大致按照使用的频率列出):import、contentType、pageEncoding、session、isELIgnored(只限 JSP 2.0)、buffer、autoFlush、info、errorPage、isErrorPage、isThreadSafe、language 和 extends

import 属性

使用 page 指令的 import 属性指定 JSP 页面转换成的 servlet 应该引入的包。在 JSP 中,包是必需的。原因是,如果没有使用包,系统则认为所引用的类与当前类在同一个包中。例如,假定一个 JSP 页面包含下面的 scriptlet:

<% User user = new User(); %>
默认情况下,servlet 导入 java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*,也许还包括一些服务器特有的包。编写 JSP 代码时,绝不要依靠任何自动导入的服务器特有类。这样做会使得代码不可移植。

使用 import 属性时,可以采用下面两种形式:

<%@ page import="com.xuetang9.entity.User" %>
<%@ page import="package.class1, ..., package.classN" %>

import 是 page 的属性中惟一允许在同一文档中多次出现的属性。尽管 page 指令可以出现在文档中的任何地方,但一般不是将 import 语句放在文档顶部附近,就是放在相应的包首次使用之前。

contentType 和 pageEncoding 属性

contentType 属性设置 Content-Type 响应报头,标明即将发送到客户程序的文档的 MIME 类型。
使用 contentType 属性时,可以采用下面两种形式:

<%@ page contentType="MIME-TYPE" %>
<%@ page contentType="MIME-Type; charset=Character-Set" %>

例如,指令

<%@ page contentType="application/vnd.ms-excel" %>

和下面的 scriptlet 所起到的作用基本相同

<% response.setContentType("application/vnd.ms-excel"); %>
两种形式的第一点不同是,response.setContentType 使用明确的 Java 代码(这是一些开发人员力图避免使用的方式),而 page 指令只用到 JSP 语法。第二点不同是,指令被特殊处理,它们不是在出现的位置直接成为 _jspService 代码。这意味着 response.setContentType 能够有条件地调用,而 page 指令不能。条件性地设置内容的类型主要用在同一内容能够以多种不同的形式进行显示的情况下。

不同于常规 servlet (默认的 MIME 类型为 text/plain),JSP 页面的默认 MIME 类型是 text/html (默认字符集为 ISO-8859-1)。因此,如果 JSP 页曲以 Latin 字符集输出 HTML则根本无需使用 contentType,如果希望同时更改内容的类型和字符集,可以使用下面的语句:

<%@ page contentType="someMimeType; charset=someCharacterSet" %>

但是,如果只想更改字符集,使用 pageEncoding 属性更为简单。例如,中文 JSP 页面可以使用下面的语句:

<%@ page pageEncoding="UTF-8" %>

session属性

session 属性控制页面是否参与 HTTP 会话。使用这个属性时,可以采用下面两种形式:

<%@ page session="true" %> <%--Default--%>
<%@ page session="false" %>
 true 值(默认)表示,如果存在已有会话,则预定义变量 session (类型为HttpSession)应该绑定到现有的会话;否则,创建新的会话并将其绑定到 session。false 值表示不自动创建会话,在 JSP 页面转换成 servlet 时,对变量 session 的访问会导致错误。
对于高流量的网站,使用 session="false" 可以节省大量的服务器内存。但要注意,session="false" 并不禁用会话跟踪,它只是阻止 JSP 页面为那些尚不拥有会话的用户创建新的会话。由于会话是针对用户,不是针对页面,所以,关闭某个页面的会话跟踪没有任何益处,除非有可能在同一客户会话中访问到的相关页面都关闭会话跟踪。

isELIgnored 属性

isELIgnored 属性控制的是:忽略(true)JSP 2.0 表达式语言(EL),还是进行正常的求值(false)。这是 JSP 2.0 新引入的属性;在只支持 JSP 1.2 及早期版本的服务器中,使用这项属性是不合法的。这个属性的默认值依赖于 Web 应用所使用的 web.xml 的版本。如果 web.xml 指定 servlet 2.3(对应JSP 1.2)或更早版本,默认值为 true(但变更默认值依旧是合法的,JSP 2.0 兼容的服务器中都允许使用这项属性,不管 web.xml 的版本如何)。如果 web.xml 指定 servlet 2.4(对应 JSP 2.0)或之后的版本,那么默认值为false。使用这个属性时,可以采用下面两种形式:

<%@ page isELIgnored="false" %>
<%@ page isELIgnored="true" %>

buffer 和 autoFlush 属性

buffer 属性指定 out 变量(类型为 JspWriter )使用的缓冲区的大小。使用这个属性时,可以采用下面两种形式:

<%@ page buffer="size kb" %>
<%@ page buffer="none" %>

服务器实际使用的缓冲区可能比指定的更大,但不会小于指定的大小。例如,<%@ page buffer="32kb" %> 表示应该对文档的内容进行缓存,除非累积至少为32KB、页面完成或明确地对输出执行清空(例如使用 response. flushBuffer),否则不将文档发送给客户。

默认的缓冲区大小与服务器相关,但至少8KB。如果要将缓冲功能关闭,应该十分小心:这样做要求设置报头或状态代码的 JSP 元素都要出现在文件的顶部,位于任何 HTML 内容之前。另一方面,有时输出内容的每一行都需要较长的生成时间,此时禁用缓冲或使用小缓冲区会更有效率;这样,用户能够在每一行生成之后立即看到它们,而不是等待更长的时间看到成组的行。

autoFlush 属性控制当缓冲区充满之后,是应该自动清空输出缓冲区(默认),还是在缓冲区溢出后抛出一个异常(autoFlush=”false”)。使用这个属性时,可以采用下面两种形式:

<%@ page autoFlush="true" %> <%--Default--%>
<%@ page autoFlush="false" %>

在 buffer=”none” 时,false 值是不合法的。如果客户程序是常规的 Web 浏览器,那么 autoFlush=”false” 的使用极为罕见。但是,如果客户程序是定制应用程序,可能希望确保应用程序要么接收到完整的消息,要么根本没有消息。false 值还可以用来捕获产生过多数据的数据库查询,但是,一般说来,将这些逻辑放在数据访问代码中(而非表示代码)要更好一些。

info 属性

info 属性定义一个可以在 servlet 中通过 getServletInfo 方法获取的字符串,使用 info 属性时,采用下面的形式:

<%@ page info="本JSP用来说明Page指令中info属性的作用" %>

errorPage 和 isErrorPage 属性

errorPage 属性用来指定一个 JSP 页面,由该页面来处理当前页面中抛出但未被捕获的任何异常(即类型为 Throwable 的对象)。它的应用方式如下:

<%@ page errorPaqe="Relative URL" %>

指定的错误页面可以通过 exception 变量访问抛出的异常。
isErrorPage 属性表示当前页是否可以作为其他 JSP 页面的错误页面。使用 isErrorPage 属性时,可以采用下面两种形式:

<%@ page isErrorPage="true" %>
<%@ page isErrorPage="false" %> <%--Default--%>

isThreadSafe 属性

isThreadSafe 属性控制由 JSP 页面生成的 servlet 是允许并行访问(默认),还是同一时间不允许多个请求访问单个 servlet 实例(isThreadSafe=”false”)。使用 isThreadSafe 属性时,可以采用下面两种形式:

<%@ page isThreadSafe="true" %> <%--Default--%>
<%@page isThreadSafe="false" %>
遗憾的是,阻止并发访问的标准机制是实现 SingleThreadModel接口。尽管在早期推荐使用 SingleThreadModel 和 isThreadSafe="false",但最近的经验表明 SingleThreadModel 的设计很差,使得它基本土毫无用处。因而,应该避免使用 isThreadSafe,采用显式的同步措施取而代之。

extends 属性

extends 属性指定 JSP 页面所生成的 servlet 的超类(superclass )。它采用下面的形式:

<%@ page extends="package.class" %>

这个属性一般为开发人员或提供商保留,由他们对页面的运作方式做出根本性的改变(如添加个性化特性)。一般开发者应该避免使用这个属性,除非引用由服务器提供商专为这种目的提供的类。

language 属性

从某种角度讲,language 属性的作用是指定页面使用的脚本语言,如下所示:

<%@ page language="java" %>
就现在来说,由于 Java 既是默认选择,也是惟一合法的选择,所以没必要再去关心这个属性。

DataGrip是一款数据库管理客户端工具,方便连接到数据库服务器,执行sql、创建表、创建索引以及导出数据等。相信第一眼看到DataGrip以后,会有一种惊艳的感觉,就好比第一眼看到一个姑娘,就是那么一瞥,你对自己说,就是她了!废话不多说,来看看DataGrip的常用功能:

一、下载及安装

链接:https://pan.baidu.com/s/1K-y4QonzIE3cWoIm0weX1Q
提取码:4uzc
先点击免费试用,直接把破解补丁拖到DataGrip主界面即可完成激活。

二、选择数据库类型并加载连接驱动

file->data Sources ->选择数据库类型

三、配置数据库连接


我填写的URL:jdbc:mysql://localhost:3306/?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true

四、执行sql语句


也可以使用查询快捷键:ctrl + enter

以下是各响应码的具体含义,需要时查询即可:

状态响应码 用来表示接收到请求并继续处理
100 客户端必须继续发出请求
101 客户端要求服务器根据请求转换HTTP协议版本
状态响应码 用来表示接收到请求并且继续处理
200 表明该请求被成功地完成,所请求的资源发送到客户端
201 提示知道新文件的URL
202 接受并处理,但处理未完成
203 返回信息不确定或不完整
204 收到请求,但返回信息为空
205 服务器完成了请求,用户必须复位当前已经浏览过的文件
206 服务器已经完成了部分用户的GET请求
状态响应码 该类型状态码表示为了完成指定的动作,必须接受进一步处理
300 请求的资源可在多处获得
301 本网页被永久性转移到另一个URL
302 请求的网页被重定向到新的地址
303 建议用户访问其他URL或访问方式
304 自从上次请求后,请求的网页未修改过
305 请求的资源必须从服务器指定的地址获得
306 前一版本HTTP中使用的代码,现已不再使用
307 声明请求的资源临时性删除
状态响应码 该类型状态码表示请求包含错误语法或不能正确执行
400 客户端请求有语法错误
401 请求未经授权
402 保留有效ChargeTo头响应
403 禁止访问,服务器收到请求,但拒绝提供服务
404 可连接服务器,但服务器无法取得所请求的网页,请求资源不存在
405 用户在Request-Line字段定义的方法不被允许
406 根据用户发送的Accept,请求资源不可访问
407 类似401,用户必须首先在代理服务器上取得授权
408 客户端没有在用户指定的时间内完成请求
409 对当前资源状态,请求不能完成
410 服务器上不再有此资源
411 服务器拒绝用户定义的Content-Length属性请求
412 一个或多个请求头字段在当前请求中错误
413 请求的资源大于服务器允许的大小
414 请求的资源URL长于服务器允许的长度
415 请求资源不支持请求项目格式
416 请求中包含Range请求头字段,在当前请求资源范围内没有range指示值
417 服务器不满足请求Expect头字段指定的期望值
状态响应码 该类型状态码表示服务器或网关错误
500 服务器错误
501 服务器不支持请求的功能
502 网关错误
503 无法获得服务
504 网关超时
505 不支持的http版本

什么是nodejs?

简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。

第一步:下载安装程序

官网下载地址:https://nodejs.org/en/download/

选择合适的版本点击下载即可。我这里选择的是64位最新版安装包。

第二步:安装

1、下载完成后,双击“node-v14.2.0-x64.msi”,开始安装Node.js

点击【Next】按钮


勾选复选框,点击【Next】按钮


修改好目录后,点击【Next】按钮


上面共有四大选项:
– 安装Node核心模块
– 安装npm
– 安装文档
– 把Node和npm及其模块添加到环境变量
默认安装这四项就好了,如果不选,之后在cmd窗口想运行node、npm等执行程序会报错,系统找不到指定文件,当然也可以进行手动配置。然后继续Next……


这是在询问是否自动安装2个工具:
1、构建工具(Python 2和Visual Studio构建工具)
2、Chocolatey
构建工具是因为一些npm模块需要使用C/C++编译,如果想要编译这些模块,则需要安装这个工具。如果不安装这个构建工具,在之后使用 npm 安装模块的时候,会报错:gyp ERR! find Python
如果见到这个错误,就知道是因为没有安装构建工具。
构建工具和 Chocolatey 都是必装的,如果现在没有安装,可以之后再手动安装,提示里已经给出了相关解释:https://github.com/nodejs/node-gyp#on-windows
该提示还告诉我们: Chocolatey 会在后面弹出一个 cmd 来安装。
为了避免以后麻烦,这里强烈建议选择“Automatically install …” ,然后 Next…


选择 Install 安装,如果系统弹出是否允许控制权限,记得点“是”


这是在自动安装 Chocolatey。
如果选择了“Automatically install…”,按Finish之后,会弹出一个cmd,我们在cmd窗口“按任意键继续”,然后只要等待安装完成即可。
如果关闭cmd窗口或者没有选择“Automatically install…”,则按Finish之后安装步骤全部完成,不会弹出cmd窗口(不会安装Python 2和Visual Studio这2个工具)。
等待cmd窗口按任意键继续,然后等待自动安装完成,安装就结束了。


如果系统没有安装Python模块,这就会自动安装,速度稍慢。

安装完成后打开 cmd(或powershell),输入命令 node -v 或者 npm -v 来查看node当前版本号或者npm当前版本:

常见错误

1、如果某些组件安装不成功,可以安装Python后重新安装node.js
下载及安装、配置Python请移步师兄的文章:

Python学习笔记(配置开发环境)

2、‘npm’不是内部或外部命令,也不是可运行的程序
这是因为没有指定运行文件的位置,所以cmd找不到这个运行文件,可以手动添加 Windows 环境变量。
手动配置 Windows 环境变量:
如果 没有选择“把Node和npm及其模块添加到环境变量”,那在使用npm或者node命令的时候,因为cmd找不到运行程序,这时候需要可以手动配置 Windows 环境变量。(当然,还可以卸载了重新装,记得把所有安装都装上)
默认安装路径则是C:\Program Files\nodejs\ ,所以我们要添加的环境变量就是这个路径,添加完成之后,Windows 系统就能通过环境变量找到这个执行文件。
操作方式:
右键“我的电脑”D
选择“属性”
在左侧栏选择“高级系统设置”
选中选项卡“高级”
点击右下角“环境变量(N)”
系统环境变量(s) ,双击变量名为“path”哪一行,添加 D:\develop\nodejs\(默认安装则是 C:\Program Files\nodejs\)
然后再打开 cmd 运行命令则一切正常。

作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。
使用:
@SuppressWarnings(“”)
@SuppressWarnings({})
@SuppressWarnings(value={})
示例:
@SuppressWarnings(“unchecked”)
    告诉编译器忽略 unchecked 警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。

@SuppressWarnings(“serial”)
    如果编译器出现这样的警告信息:The serializable class WmailCalendar does not 

declare a static final serialVersionUID field of type long
    使用这个注释将警告信息去掉。

@SuppressWarnings(“deprecation”)
    如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。
    使用这个注释将警告信息去掉。

@SuppressWarnings(“unchecked”, “deprecation”)
    告诉编译器同时忽略unchecked和deprecation的警告信息。

@SuppressWarnings(value={“unchecked”, “deprecation”})
    等同于@SuppressWarnings(“unchecked”, “deprecation”)

抑制单类型警告

@SuppressWarnings("unchecked")
public void addItems(String item){
  @SuppressWarnings("rawtypes")
   List items = new ArrayList();
   items.add(item);
}

抑制多类型警告

@SuppressWarnings(value={"unchecked", "rawtypes"})
public void addItems(String item){
   List items = new ArrayList();
   items.add(item);
}

抑制全部警告

@SuppressWarnings("all")
public void addItems(String item){
   List items = new ArrayList();
   items.add(item);
}

注解目标

通过 @SuppressWarnings 的源码可知,其注解目标为类、字段、函数、函数入参、构造函数和函数的局部变量。建议将注解声明在最接近警告发生的位置

抑制警告的关键字

关键字 含义 英文对照
all 抑制所有警告 to suppress all warnings
boxing 抑制装箱、拆箱操作时的警告 to suppress warnings relative to boxing/unboxing operations
cast 抑制映射相关的警告 to suppress warnings relative to cast operations
dep-ann 抑制启用注释的警告 to suppress warnings relative to deprecated annotation
deprecation 抑制过期方法警告 to suppress warnings relative to deprecation
fallthrough 抑制确在switch中缺失breaks的警告 to suppress warnings relative to missing breaks in switch statements
finally 抑制finally模块没有返回的警告 to suppress warnings relative to finally block that don’t return
hiding 抑制相对于隐藏变量的局部变量的警告 to suppress warnings relative to locals that hide variable
incomplete-switch 忽略没有完整的switch语句 to suppress warnings relative to missing entries in a switch statement (enum case)
nls 忽略非nls格式的字符 to suppress warnings relative to non-nls string literals
null 忽略对null的操作 to suppress warnings relative to null analysis
rawtypes 使用generics时忽略没有指定相应的类型 to suppress warnings relative to un-specific types when using generics on class params
restriction 抑制与使用不鼓励或禁止的引用相关的警告 to suppress warnings relative to usage of discouraged or forbidden references
serial 忽略在serializable类中没有声明serialVersionUID变量 to suppress warnings relative to missing serialVersionUID field for a serializable class
static-access 抑制不正确的静态访问方式警告 to suppress warnings relative to incorrect static access
synthetic-access 抑制子类没有按最优方法访问内部类的警告 to suppress warnings relative to unoptimized access from inner classes
unchecked 抑制没有进行类型检查操作的警告 to suppress warnings relative to unchecked operations
unqualified-field-access 抑制没有权限访问的域的警告 to suppress warnings relative to field access unqualified
unused 抑制没被使用过的代码的警告 to suppress warnings relative to unused code

logging模块用于输出运行日志,可以设置不同的日志等级,保存信息到日志文件中等。 相比print()函数,logging可以设置日志的等级,控制在发布版本中的输出内容,并且可以指定日志的输出格式。
下面通过一段代码迅速上手:

import logging
    logging.basicConfig()        # 使用默认配置
    logging.debug("调试信息")
    logging.info("普通日志信息")
    logging.warning("警告信息")
    logging.error("错误信息")
    logging.critical("致命错误")

输出结果如下:

WARNING:root:警告信息
ERROR:root:错误信息
CRITICAL:root:致命错误

使用 basicConfig() 方法已经能够满足基本的使用需要,如果这个方法没有传入参数,会根据默认的配置创建日志Logger 对象,默认的日志级别被设置为 WARNING,所以调试信息、普通信息并没有打印。配置函数可选的参数在下面的表格中详细列出:

设定相关参数后的代码如下:

# 设置打印日志级别:CRITICAL(严重的) > ERROR > WARNING > INFO > DEBUG
logging.basicConfig(
        level=logging.DEBUG, 
        filename="log.log", 
        filemode="w", 
        format="%(asctime)s - %(name)s - %(filename)s [line:%(lineno)d] - %(levelname)s - %(message)s"
)
logging.debug("调试信息")
logging.info("普通日志信息")
logging.warning("警告信息")
logging.error("错误信息")
logging.critical("致命错误")

打印格式format的常用格式如下:

更加详细的变量及说明可以参考官方文档:
https://docs.python.org/zh-cn/3.8/library/logging.html#logrecord-attributes

需要注意的是,当发生异常时,直接使用无参方法debuge()、warning()、error()、critical()方法是无法记录日志信息的,需要设置exc_info参数为True。下面给出参考代码:

import logging

logging.basicConfig(
    level=logging.DEBUG,
    filename="log.log",
    filemode="w",
    format="%(asctime)s - %(name)s - %(filename)s [line:%(lineno)d] - %(levelname)s - %(message)s"
)
try:
    result = 10 / 0
except Exception as ex:
    logging.exception("除数为零异常")    # 推荐使用,不需要手动设置True
    logging.error("除数为零异常", exc_info=True)
    logging.log(level=logging.DEBUG, msg="除数为零异常", exc_info=True)

第一步:安装Python解释器并配置path环境变量

下载及安装、配置Python请移步阿斌师兄的文章:

Python学习笔记(配置开发环境)

第二步:安装virtualenv,即Python解释器的虚拟环境

(本次教程后面并没有使用到,第二步可以暂时跳过,后面创建复杂项目时一并补上)
在配置好Python环境变量后,在控制台输入以下命令:

pip install virtual

如果想提升pip的下载速度,可以移步下面的文章:

体验飞速模块安装:PIP更换国内安装源

第三步:下载并安装VsCode编辑器

安装时,可以默认将所有复选框都选中
下载地址:https://code.visualstudio.com

第四步:在VsCode中安装Python插件


安装的python插件可以起到以下的作用:
1、让VsCode具有调用Python解释器的能力。其实就是在setting.json和launch.json这两个配置文件中,可以添加python相关的配置了,比如通过python.pythonPath的值找到python解释器的位置等等。
2、按下ctrl键后点击某个函数,可以打开函数所在的文件及定义的位置
3、让VsCode具备代码提示功能
安装完python插件后建议重启VsCode使插件生效。

第五步:在VsCode下创建并运行一个Python项目

5-1:创建一个总项目目录,可以保存多个项目的工作区
我的工作区目录:F:/VsCodeWorkdSpace
可以在VsCode环境下直接打开创建的工作区目录

5-2:在工作区目录下创建Python工程目录

5-3:为项目运行配置Python解释器
5-3-1:选中创建的项目文件夹,我的是:PythonProject1

5-3-2:按下快捷键 ctrl + shift + p 选择Python解释器


我的机器上安装了2.x和3.x版本的Python解释器,大家可以选择3.x版本的Python解释器
选择完Python解释器后,工作区文件夹下会自动生成.vscode文件夹和settings.json文件
文件内容就是我们刚刚选择的Python命令的路径:

{
    "python.pythonPath": "C:\\Program Files (x86)\\Python38-32\\python.exe"
}

5-3-3:为项目运行指定入口文件及参数




至此,一个基本的VsCode+Python的开发环境我们已经配置好了,下面就可以在项目中创建一个Python文件并运行了

第六步:创建Python文件并运行

点击右上角的三角按钮运行Python代码:

也可以在空白处点击鼠标右键,选择不同的运行方式:

最后说一个由文件名引起的错误:
在直播课上给小伙伴们分享了一个使用Python书写的《天空之城》音乐播放程序
文件名:用Python写一段音乐(winsound).py
在Pycharm下可以运行,但在VsCode环境下却出现错误:

经过测试,是因为文件名中包含了特殊字符小括号:()
文件名去掉小括号即可正常运行。
附上Python代码:

from winsound import Beep

# 某大神使用Python书的写天空之城,运行时请使用耳机或音箱播放
def sound():
    Beep(880, 250)
    Beep(988, 250)
    Beep(523 * 2, 600)
    Beep(988, 300)
    Beep(523 * 2, 600)
    Beep(659 * 2, 600)
    Beep(988, 1000)
    Beep(659, 250)
    Beep(659, 250)
    Beep(880, 600)
    Beep(784, 300)
    Beep(880, 600)
    Beep(523 * 2, 600)
    Beep(784, 1000)
    Beep(659, 600)
    Beep(698, 800)
    Beep(659, 300)
    Beep(698, 600)
    Beep(523 * 2, 600)
    Beep(659, 980)
    Beep(523 * 2, 250)
    Beep(523 * 2, 250)
    Beep(523 * 2, 250)
    Beep(988, 600)
    Beep(739, 300)
    Beep(739, 600)
    Beep(988, 600)
    Beep(988, 1000)
    Beep(880, 250)
    Beep(988, 250)
    Beep(523 * 2, 600)
    Beep(988, 300)
    Beep(523 * 2, 600)
    Beep(659 * 2, 600)
    Beep(988, 1000)
    Beep(659, 250)
    Beep(659, 250)
    Beep(880, 600)
    Beep(784, 300)
    Beep(880, 600)
    Beep(523 * 2, 600)
    Beep(784, 1000)
    Beep(659, 600)
    Beep(698, 800)
    Beep(659, 300)
    Beep(698, 600)
    Beep(523 * 2, 600)
    Beep(659, 980)
    Beep(523 * 2, 250)
    Beep(523 * 2, 250)
    Beep(523 * 2, 250)
    Beep(988, 600)
    Beep(739, 300)
    Beep(739, 600)
    Beep(988, 600)
    Beep(988, 1000)

sound()

pip国内的一些镜像

    阿里云 http://mirrors.aliyun.com/pypi/simple/ 
    中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 
    豆瓣(douban) http://pypi.douban.com/simple/ 
    清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 
    中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

临时使用时,可以在pip后添加 -i 参数,指定pip源:

# 比如安装pygame模块(任选其一)
pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install pygame -i http://mirrors.aliyun.com/pypi/simple
pip install pygame -i http://pypi.douban.com/simple
pip install scrapy -i http://pypi.mirrors.ustc.edu.cn/simple
........

如果想一劳永逸永久修改安装源:

Linux下:
修改~/.pip/pip.conf (没有就创建一个), 内容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

Windows下:
1、直接在user目录下创建一个pip目录,如:c:\Users\用户名\pip
2、在新创建的pip目录下新建文件:pip.ini,复制内容如下

[global]
timeout=6000
index-url=https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host=pypi.tuna.tsinghua.edu.cn

或者也可以这样操作:
1、Win + R 键打开用户目录:%HOMEPATH%

2、按确定后会打开当前用户目录,在这个目录下创建pip文件夹
3、在新建的pip目录下新建文件:pip.ini,复制以下内容:

[global]
timeout=6000
index-url=https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host=pypi.tuna.tsinghua.edu.cn

Pygame最初由Pete Shinners开发,它是一个跨平台的Python模块,专为电子游戏设计,包含图像、声音和网络支持。这些功能使开发者能够很容易地使用Python编写一个游戏。虽然不使用Pygame也能写一个游戏,但如果充分利用Pygame库中已经写好的代码,开发就要容易很多。Pygame能把游戏设计者从低级语言的束缚中解放出来,专注于游戏逻辑本身。
由于Pygame很容易使用并且跨平台,所以在游戏开发中十分受欢迎。因为Pygame是开放源代码的软件,也促使一大批游戏开发者为完善和增强它的功能而努力。

安装pygame库

1、 在控制台下安装pygame

python -m pip install -U pygame --user
python -m pygame.examples.aliens

import pygame
print(pygame.ver)

注意,如果使用pip安装模块时有类似下面的错误信息:
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the ‘python -m pip install –upgrade pip’ command
那么可以使用给出的提示命令升级pip:
升级pip

如果感觉安装速度异常慢,也可以参考这篇文章更换国内的安装源:

体验飞速模块安装:PIP更换国内安装源

pip升级成功后就可以使用以下命令安装pygame模块了:

pip install pygame

2、在Pycharm环境下安装pygame

1、打开当前工程的解释器配置界面:
File – Settings – Project:当前工程名称 – Project Interpreter


2、单击Project Interpreter窗口三角按钮上面的 “+”按钮,安装pygame模块

出现“Package ‘pygame’ installed successfully”表示模块已安装成功

根据实际测试,如果出现安装错误,建议大家使用清华大学的源