flask框架学习

基本概念 1.静态资源 ​ 一旦准备好资源,不在需要经常变化的资源.由于该资源不需要经常变化,所以可以提前准备.比如png/jpg/css/js等文件 2.动态资源 ​ 和静态资源相反,这种资源会经常变化.比如,我们要编写一个电商网站,我们无法预测用户在浏览商品时选择什么样的条件。 根据用户选择条件不同,我们给用户提供可供选择的商品就不同.这种资源无法提前准备。 ...

6 min · 2658 words · Luenci

Git命令集合

git config 配置 Git 的相关参数。 Git 一共有3个配置文件: 仓库级的配置文件:在仓库的 .git/.gitconfig,该配置文件只对所在的仓库有效。 全局配置文件:Mac 系统在 ~/.gitconfig,Windows 系统在 C:\Users\<用户名>\.gitconfig。 系统级的配置文件:在 Git 的安装目录下(Mac 系统下安装目录在 /usr/local/git)的 etc 文件夹中的 gitconfig。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 # 查看配置信息 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> -l # 查看当前生效的配置信息 $ git config -l # 编辑配置文件 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> -e # 添加配置项 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> --add <name> <value> # 获取配置项 $ git config <--local | --global | --system> --get <name> # 删除配置项 $ git config <--local | --global | --system> --unset <name> # 配置提交记录中的用户信息 $ git config --global user.name <用户名> $ git config --global user.email <邮箱地址> # 更改Git缓存区的大小 # 如果提交的内容较大,默认缓存较小,提交会失败 # 缓存大小单位:B,例如:524288000(500MB) $ git config --global http.postBuffer <缓存大小> # 调用 git status/git diff 命令时以高亮或彩色方式显示改动状态 $ git config --global color.ui true # 配置可以缓存密码,默认缓存时间15分钟 $ git config --global credential.helper cache # 配置密码的缓存时间 # 缓存时间单位:秒 $ git config --global credential.helper 'cache --timeout=<缓存时间>' # 配置长期存储密码 $ git config --global credential.helper store ...

8 min · 3956 words · Luenci

JavaScript基本知识

JavaScript作用 表单动态检验(密码强度检测) 网页特效 服务端开发(Node.js) 桌面程序(Electron) APP(Cordova) 控制硬件 - 物联网(Ruff) 游戏小程序(cocos2d-js) HTML/CSS/JS的关系 HTML/CSS标记语言–描述类语言 HTML决定网页结构和内容(决定看到什么),相当于人的身体 CSS决定网页呈现给用户的模样(决定好不好看),相当于给人穿衣服、化妆 JS脚本语言-编程类语言 实现业务逻辑和页面控制(决定功能),相当于人的各种动作 浏览器执行js 浏览器分成两部分:渲染引擎和JS引擎 ...

7 min · 3181 words · Luenci

Java基本知识

方法 1 2 3 4 5 // 定义方法的格式 修饰符 返回值类型 方法名称(参数类型 参数名称,....){ 方法体; return 返回值; } 修饰符:现阶段的固定方法,public static 返回值类型:也就是方法最终产生的数据结果是什么类型 方法名称:方法的名字,规则和变量一样,小驼峰 参数类型:进入方法的数据对应的变量名称 方法体:方法需要做的事情,若干行代码 return:两个作用。 停止当前方法 将后面的结果数据返回值返还给调用处 返回值:也就是方法执行后最终产生的数据结果 return后面的“返回值”,必须和方法名称前面的“返回值类型”,保持对应 注意事项 方法应该定义在类中,但是不能在方法 在定义方法。不能嵌套 方法定义的前后顺序无所谓 方法定义之后不会执行,若要执行,必须调用:单独调用,打印调用,赋值调用 如果方法有返回值,那么必须写上“return 返回值”,不能缺失 return后面的返回值类型必须和方法的返回值类型相同,对应。 对于一个void没有返回值的方法,没有返回值。 一个方法中可以含有多个return语句,但是必须保证同时只有一个会被执行到。 方法重载 多个方法的名称一样,但是参数列表不一样 优点:只需要记住唯一一个方法名称,就可以实现类似的多个功能 相关因素 参数个数不同 参数类型不同 参数的多类型顺序不同 无关因素 与参数的名称无关 与方法的返回值类型无关 数组 数组的概念:是一种容器,可以同时存放多个数据值。 数组的特点: 1.数组是一种引用数据类型 2.数组当中的多个数据,类型必须统一 3.数组的长度在程序运行期间不可改变 数组声明 数组的初始化:在内存当中创建一个数组,并且向其中赋予一些默认值。 两种常见的初始化方式: 1.动态初始化(指定长度) 2.静态初始化(指定内容) 动态初始化数组的格式: 声明格式:数据类型[]数组名称=new数据类型[数组长度]; 静态初始化数组的格式: 声明格式(标准):数据类型[] 数组名称 = new 数据类型[] {元素1,元素2,...} 省略格式:数据类型[] 数组名称 = {元素1,元素2,...} 注意事项: 1.静态初始化没有直接指定长度,但是仍然会自动推算得到长度。 2.静态初始化标准格式可以拆分成为两个步骤。 3.动态初始化也可以拆分成为两个步骤。 4.静态初始化一旦使用省略格式,就不能拆分成为两个步骤了。 如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化 使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值。 规则如下: 如果是整数类型,那么默认为0 如果是浮点类型,那么默认为0.0 如果是字符类型,那么默认为'\u0000' 如果是布尔类型,那么默认为false 如果是引用类型,那么默认为null 静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。 数组的长度一旦创建,程序运行期间,长度不可变 ...

16 min · 8010 words · Luenci

Java语言概述

Java语言简史 Java语言是美国Sun公司(Stanford University Network),在1995年推出的高级编程语言。所谓编程语言,是计算机的语言,人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功能。 Java语言发展历史 1995年Sun公司发布Java1.0版本 1997年发布Java1.1版本 1998年发布Java1.2版本 2000年发布Java1.3版本 2002年发布Java1.4版本 2004年发布Java5版本(更新频率较大) 2006年发布Java6版本 2009年Oracle甲骨文公司收购Sun公司,并于2011发布Java7版本 2014年发布Java8版本(更新频率较大,市场占有率最大) 2017年9月发布Java9版本 2018年3月发布Java10版本 Java 平台的三个版本 作用: 这使软件开发人员、服务提供商和设备生产商可以针对特定的市场进行开发: Java SE(Java Platform,Standard Edition) Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。 Java EE(Java Platform,Enterprise Edition) 这个版本以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。 Java ME(Java Platform,Micro Edition) 这个版本以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。 开发环境,推荐Eclipse,NetBeans,这两个IDE可以挂接对应的插件,进行开发。还有一点,那就是这三个应用,se,标准应用,以学习为主,由于界面,开发成本,速度等问题,很少用来做程序,但不是说,他不能做程序,Eclipse,NetBeans,都是javase写起来的。Me,移动设备应用,对于一些中高端应用还好了!以前用他做过手机游戏,呵呵呵!EE,企业级解决方案,开发套件全部免费,可控性好,安全性高,乃是当前B2B的规范。再者,这三个应用,都需要虚拟机的支持。 ...

11 min · 5150 words · Luenci

Java面向对象

面向对象 三大特征:封装性,继承性,多态性。 继承是多态的前提,如果没有继承,就没有多态 继承主要解决的问题是:共性抽取 继承 父类也可以叫基类,超类 子类也可以叫派生类 ...

7 min · 3466 words · Luenci

Linux学习(一)

Linux操作系统 “一切皆文件” 系统启动流程 引导图 最初始阶段 当我们打开计算机电源,计算机会自动从主板的BlOS(Basic Input/output System)读取其中所存储的程序。这一程序通常知道一些直接连接在主板上的硬件(硬盘,网络接口,键盘,串口,并口)。现在大部分的BIOS允许你从软盘、光盘或者硬盘中选择一个来启动计算机。 下一步,计算机将从你所选择的存储设备中读取起始的512 bytes(比如光盘一开是的512 bytes,如果我们从光盘启动的话)。这512bytes叫做主引导记录MBR(master boot record)。MBR会告诉电脑从该设备的某一个分区(partition)来装载引导加载程序(boot loader)。Boot loader储存有操作系统(OS)的相关信息,比如操作系统名称,操作系统内核(kernel)所在位置等。常用的boot loader有GRUB和LILO。 随后,boot loader会帮助我们加载kernel。kernel实际上是一个用来操作计算机的程序,它是计算机操作系统的内核,主要的任务是管理计算机的硬件资源,充当软件和硬件的接口。操作系统上的任何操作都要通过kernel传达给硬件。Windows和Linux各自有自己kernel。 狭义的操作系统就是指kernel,广义的操作系统包括kernel以及kernel之上的各种应用。 (Linus Torvalds与其说是Linux之父,不如说是Linux kernel之父。他依然负责Linux kernel的开发和维护。至于Ubuntu,Red Hat,它们都是基于相同的kernel之上,囊括了不同的应用和界面构成的一个更加完整的操作系统版本。)实际上,我们可以在多个分区安装boot loader,每个boot loader对应不同的操作系统,在读取MBR的时候选择我们想要启动的boot loader。这就是多操作系统的原理。 小结:BlOS -> MBR -> boot loader -> kernel kernel 如果我们加载的是Linux kernel,Linux kernel开始工作。kernel会首先预留自己运行所需的内存空间,然后通过驱动程序(driver)检测计算机硬件。这样,操作系统就可以知道自己有哪些硬件可用。随后,kernel会启动一个init进程。它是Linux系统中的1号进程(Linux系统没有0号进程)。到此,kernel就完成了在计算机启动阶段的工作,交接给init来管理。 小结:kernel -> init process init process (根据boot loader的选项,Linux此时可以进入单用户模式(single user mode))。在此模式下,初始脚本还没有开始执行,我们可以检测并修复计算机可能存在的错误)随后,init会运行一系列的初始脚本(startup scripts),这些脚本是Linux中常见的shell scripts。这些脚本执行如下功能: 设置计算机名称,时区,检测文件系统,挂载硬盘,清空临时文件,设置网络等 当这些初始脚本,操作系统已经完全准备好了,只是,还没有人可以登录!!!init会给出登录(login)对话框,或者是图形化的登录界面。 输入用户名(比如说luenci)和密码,DONE! 在此后的过程中,你将以用户(user)luenci的身份操作电脑。此外,根据你创建用户时的设定,Linux还会将你归到某个组(group)中,比如可以是stupid组,或者是luenci组。所以你将是用户luenci,同时是luenci组的组员。(注意,组luenci和用户luenci只是重名而已,就好想你可以叫Dell,同时还是Dell公司的老板一样。你完全也可以是用户luenci,同时为stupid组的组员) 启动级别 7种运行级别 运行级别(Runlevel)指的是Unix或者Linux等类Unix操作系统的运行模式,不同的运行模式下系统的功能也有所有不同。Linux 系统下通常分为7种运行级别,分别是从0到6。各级别介绍如下: 0–停机模式 在这种模式下,系统处于停机状态,系统默认运行级别不能设为0,否则将不能正常启动。这个运行级别主要用于关闭任务,在/etc/rc0.d目录下的各个连接命令都是此级别的命令,在关闭系统时,这些命令将被逐个执行。它 们会杀掉所有进程、关闭虚拟内存和交换文件、卸载文件系统和交换分区。 1– 单用户模式。 在这种运行模下,系统处于单用户工作状态,登录用户具有root权限,文件系统被加载但是网络却没有被加载,因此也无法远程登陆。这个运行级别,只允一个用户从本地计算机上登录,/etc/rc1.d目录下的所有文件与此运行级别相关连,这个运行级别一般用于系统管理与维护。 2 - -多用户模式。 用户可以通过网络进行登录,但没有NFS(Network File System),即网络文件统。/etc/rc2.d目录下所有文件与此级别相连。 3 - -完全多用户模式。 用户可以通过网络进行登录,且有NFS,用户登陆后会进入控制台命令行模式。这也是缺省的运行模式,在这种运行级别下所有网络服务程序会一起运行。/etc/rc2.d录下的文件与此级别相连 4 - -自定义模式。 这是一种系统未使用的保留模式,/etc/rc4.d目录与此级别相连。这一级别是用户自定义的运行级别,用户可以根自己的需要进行一些自定义设置。如果想要运行这一级别的话,必须在rc3.d目录下放入连接文件,就像其他rc*.d目录下的文件,并指明是启动还是终止进程。 5 - -图形化模式。 在 Linux 下运行X Window就是使用这一运行级别,用户登录后将进入图形化的GUI界面。在这一级别下除了DNS的named与级别3不同,其余的都相同。 6 – 重启模式。 系统正常关闭并重启,默认运行级别不能设为5,否则系统将不能正常启动。/etc/rc6.d目录与此级别相连。在这一运行级别下,不会关闭电源,/etc/rc6.d目录下的连接与rc0.d目录下的连接基本相同;不同之处在于,虽然它们都执行halt(关闭)命令,但是给halt传递的参数不同,所级别6会重新启动系统而0会关闭系统。 ...

11 min · 5316 words · Luenci

Linux学习(二)

Linux操作系统(二) 进程命令 ps aux 显示所有进程 ps aux | grep '' 筛选出相关进程 kill pid 杀死相关的pid进程 kill - 9 pid 强制杀死进程 jobs查看进程的工作号 fg %工作号后台程序调到前台运行 硬盘分区 fdisk -l /dev/磁盘名查看对应磁盘名的详细信息 ...

6 min · 2738 words · Luenci

Linux常用命令

Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 pwd命令 该命令的英文解释为print working directory(打印工作目录)。输入pwd命令,Linux会输出当前目录。 cd命令 cd命令用来改变所在目录。 ...

5 min · 2120 words · Luenci

list, tuple, dictionary, set的底层细节(python)

list, tuple, dictionary, set的底层细节 列表实现细节 python中的列表的英文名是list,因此很容易和其它语言(C++, Java等)标准库中常见的链表混淆。事实上CPython的列表根本不是列表(可能换成英文理解起来容易些:python中的list不是list)。在CPython中,列表被实现为长度可变的数组。可参考《Python高级编程(第2版)》 ...

5 min · 2360 words · Luenci

MySQL数据库函数

MySQL数据库函数 MySQL函数是数据库提供的内置函数,可以帮助用户更加方便地处理表中的数据。MySQL的内置函数,不但可以在SELECT查询语句中使用,同样可以在INSERT、UPDATE、DELETE等语句中使用。 1.数学函数: MySQL中内置的数学函数见下表: ...

7 min · 3198 words · Luenci

MySQL数据库引擎和数据类型

数据库引擎介绍 前言 1、存储引擎其实就是对于数据库文件的一种存取机制,如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法。 2、MySQL中的数据用各种不同的技术存储在文件(或内存)中,这些技术中的每一种技术都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同功能和能力。在MySQL中将这些不同的技术及配套的相关功能称为存储引擎。 3、根据需求可以在表中设置不同的存储引擎。 查看mysql中的引擎 MySQL中常用的几种存储引擎 1.MyISAM存储引擎 存放的位置 MySQL如果使用MyISAM存储引擎,数据库文件类型就包括.frm、.MYD、.MYI,默认存放位置是C:\Documentsand Settings\All Users\Application Data\MySQL\MySQL Server 5.1\data 存放的方式 MyISAM 这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁,主要用于高负载的select。 索引的方式 MyISAM也是使用B+tree索引但是和Innodb的在具体实现上有些不同。 该引擎基于ISAM数据库引擎,除了提供ISAM里所没有的索引和字段管理等大量功能,MyISAM还使用一种表格锁定的机制来优化多个并发的读写操作,但是需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间,否则碎片也会随之增加,最终影响数据访问性能。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMChk工具和用来恢复浪费空间的 MyISAMPack工具。MyISAM强调了快速读取操作,主要用于高负载的select,这可能也是MySQL深受Web开发的主要原因:在Web开发中进行的大量数据操作都是读取操作,所以大多数虚拟主机提供商和Internet平台提供商(Internet Presence Provider, IPP)只允许使用MyISAM格式。 MyISAM类型的表支持三种不同的存储结构:静态型、动态型、压缩型。 静态型:指定义的表列的大小是固定(即不含有:xblob、xtext、varchar等长度可变的数据类型),这样MySQL就会自动使用静态MyISAM格式。使用静态格式的表的性能比较高,因为在维护和访问以预定格式存储数据时需要的开销很低;但这种高性能是以空间为代价换来的,因为在定义的时候是固定的,所以不管列中的值有多大,都会以最大值为准,占据了整个空间。 动态型:如果列(即使只有一列)定义为动态的(xblob, xtext, varchar等数据类型),这时MyISAM就自动使用动态型,虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低,因为如果某个字段的内容发生改变则其位置很可能需要移动,这样就会导致碎片的产生,随着数据变化的增多,碎片也随之增加,数据访问性能会随之降低。 对于因碎片增加而降低数据访问性这个问题,有两种解决办法: a、尽可能使用静态数据类型; b、经常使用optimize table table_name语句整理表的碎片,恢复由于表数据的更新和删除导致的空间丢失。如果存储引擎不支持 optimize table table_name则可以转储并 重新加载数据,这样也可以减少碎片; 压缩型:如果在数据库中创建在整个生命周期内只读的表,则应该使用MyISAM的压缩型表来减少空间的占用。 优缺点:MyISAM的优势在于占用空间小,处理速度快。缺点是不支持事务的完整性和并发性。 2.innoDB存储引擎 存储位置 MySQL如果使用InnoDB存储引擎,数据库文件类型就包括.frm、ibdata1、.ibd,存放位置有两个,.frm文件默认存放位置是C:\Documents and Settings\All Users\ApplicationData\MySQL\MySQL Server 5.1\data,ibdata1、.ibd文件默认存放位置是MySQL安装目录下的data文件夹。 innodb存储引擎的mysql表提供了事务,回滚以及系统崩溃修复能力和多版本迸发控制的事务的安全。 innodb支持自增长列(auto_increment),自增长列的值不能为空,如果在使用的时候为空的话怎会进行自动存现有的值开始增值,如果有但是比现在的还大,则就保存这个值。 innodb存储引擎支持外键(foreign key) ,外键所在的表称为子表而所依赖的表称为父表。 innodb存储引擎最重要的是支持事务,以及事务相关联功能。 innodb存储引擎支持mvcc的行级锁。 innodb存储引擎索引使用的是B+Tree 优缺点:InnoDB的优势在于提供了良好的事务处理、崩溃修复能力和并发控制。缺点是读写效率较差,占用的数据空间相对较大。 ...

9 min · 4467 words · Luenci

MySQL索引和事务

索引 索引特点:创建与维护索引会消耗很多时间与磁盘空间,但查询速度大大提高! 在关系数据库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要使用索引。 索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。 例如,对于students表: id class_id name gender score 1 1 小明 M 90 2 1 小红 F 95 3 1 小军 M 88 如果要经常根据score列进行查询,就可以对score列创建索引: 1 2 ALTER TABLE students ADD INDEX idx_score (score); 使用ADD INDEX idx_score (score)就创建了一个名称为idx_score,使用列score的索引。索引名称是任意的,索引如果有多列,可以在括号里依次写上,例如: 1 2 ALTER TABLE students ADD INDEX idx_name_score (name, score); 索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如gender列,大约一半的记录值是M,另一半是F,因此,对该列创建索引就没有意义。 可以对一张表创建多个索引。索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。 对于主键,关系数据库会自动对其创建主键索引。使用主键索引的效率是最高的,因为主键会保证绝对唯一。 MySQL索引的类型 1. 普通索引 这是最基本的索引,它没有任何限制,比如上文中为title字段创建的索引就是一个普通索引,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 01 –直接创建索引 02 CREATE INDEX index_name ON table(column(length)) 03 –修改表结构的方式添加索引 04 ALTER TABLE table_name ADD INDEX index_name ON (column(length)) 05 –创建表的时候同时创建索引 06 CREATE TABLE `table` ( 07 `id` int(11) NOT NULL AUTO_INCREMENT , 08 `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , 09 `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , 10 `time` int(10) NULL DEFAULT NULL , 11 PRIMARY KEY (`id`), 12 INDEX index_name (title(length)) 13 ) 14 –删除索引 15 DROP INDEX index_name ON table ...

7 min · 3093 words · Luenci

Pandas函数

【python】Pandas中DataFrame基本函数整理 构造函数 DataFrame([data, index, columns, dtype, copy]) #构造数据框1 属性和数据 DataFrame.axes #index: 行标签;columns: 列标签 DataFrame.as_matrix([columns]) #转换为矩阵 DataFrame.dtypes #返回数据的类型 DataFrame.ftypes #返回每一列的 数据类型float64:dense DataFrame.get_dtype_counts() #返回数据框数据类型的个数 DataFrame.get_ftype_counts() #返回数据框数据类型float64:dense的个数 DataFrame.select_dtypes([include, include]) #根据数据类型选取子数据框 DataFrame.values #Numpy的展示方式 DataFrame.axes #返回横纵坐标的标签名 DataFrame.ndim #返回数据框的纬度 DataFrame.size #返回数据框元素的个数 DataFrame.shape #返回数据框的形状 DataFrame.memory_usage() #每一列的存储12345678910111213 ...

6 min · 2902 words · Luenci

Python 中的上下文管理器

with 这个关键字,对于每一学习Python的人,都不会陌生。 操作文本对象的时候,我们用 with open ,这就是一个上下文管理的例子。 1 2 with open('test.txt') as f: print f.readlines() 上下文管理器概念 基本语法 1 2 with EXPR as VAR: BLOCK 几个概念 1 2 3 1. 上下文表达式:with open('test.txt') as f: 2. 上下文管理器:open('test.txt') 3. f不是上下文管理器,应该是资源对象。 ...

4 min · 1612 words · Luenci