Python 骚操作从列表推导和生成器表达式开始

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 序列 序列是指一组数据,按存放类型分为容器序列与扁平序列,按能否被修改分为不可变序列与可变序列。 容器序列与扁平序列 容器序列存放的是对象的引用,包括list、tuple、collections.deque。 扁平序列存放的是对象的值,包括str、bytes、bytearray、memoryview和array.array。 扁平序列的值是字符、字节和数值这种基础类型。 不可变序列与可变序列 不可变序列,包括tuple、str、bytes。 可变序列,包括list、bytearray、array.array、collection.deque、memoryview。 下图左边是父类,右边是子类,可以看出可变序列是从不可变序列继承来的,扩展了可变方法: 列表推导 Python 语言魅力在于简洁,这能从最常见的创建列表体现出来,比如我们想把字符串"abc"转换成新列表["a", "b", "c"],常规写法: symbols = "abc" codes = [] for symbol in symbols: codes.append(symbol) print(codes) # ["a", "b", "c"] 用到了 for 循环和列表 append 方法。实际上可以不用 append 方法,直接: symbols = "abc" codes = [symbol for symbol in symbols] 这叫做列表推导,是更加 Pythonic 的写法。 无论是编写效率还是可阅读性,列表推导都更胜一筹,可以说是构建列表的快捷方式。但是不能滥用,通用原则是,如果列表推导的代码超过了两行,就要考虑用 append 了。这不是规定,完全可以凭借自我喜好来选择。 笛卡尔积是指多个序列中元素所有组合,我们用列表推导来实现笛卡尔积: colors = ["black", "white"] sizes = ["S", "M", "L"] tshirts = [(color, size) for color in colors for size in sizes] 一行代码搞定!Life is short,use Python,list comprehension is wonderful,amazing。 ...

SpringBoot 官方笔记 6 消息

The Spring Framework provides extensive support for integrating with messaging systems, from simplified use of the JMS API using JmsTemplate to a complete infrastructure to receive messages asynchro

DRF 对 Django 请求响应做了技术升级

Django 视图是用来处理请求和响应的,Django 默认是按 Form 和 Template 来设计的,如果要处理以 JSON 格式为主的 RESTful API,那么就需要对 Django 请求和响应的处理代码进行优化改造,本文就来介绍 DRF 在这一部分的技术升级。

Java 官方笔记 5 数字和字符串

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Numbers Number 的子类: 另外还有 BigDecimal 和 BigInteger,用于高精度计算,AtomicInteger 和 AtomicLong 用于多线程应用。 我们有时候需要用包装类而非基本数据类型,理由如下: 方法入参类型为 Object,只能传入对象 使用包装类提供的常量,比如 MIN_VALUE 和 MAX_VALUE 使用包装类的方法来做类型转换 format import java.util.Calendar; import java.util.Locale; public class TestFormat { public static void main(String[] args) { long n = 461012; System.out.format("%d%n", n); // --> "461012" System.out.format("%08d%n", n); // --> "00461012" System.out.format("%+8d%n", n); // --> " +461012" System.out.format("%,8d%n", n); // --> " 461,012" System.out.format("%+,8d%n%n", n); // --> "+461,012" double pi = Math.PI; System.out.format("%f%n", pi); // --> "3.141593" System.out.format("%.3f%n", pi); // --> "3.142" System.out.format("%10.3f%n", pi); // --> " 3.142" System.out.format("%-10.3f%n", pi); // --> "3.142" System.out.format(Locale.FRANCE, "%-10.4f%n%n", pi); // --> "3,1416" Calendar c = Calendar.getInstance(); System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006" System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am" System.out.format("%tD%n", c); // --> "05/29/06" } } DecimalFormat ...

JavaWeb 开发基础 Servlet 事件和监听器

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 事件和监听器 事件是指在程序运行过程中发生的特定动作或情况。比如: 用户操作,如点击按钮、输入文本 系统操作,如文件读取完成、网络连接断开 应用程序内部的状态变化,如对象属性改变、方法调用 监听器是一个接口或类,用于定义在特定事件发生时要执行的操作。监听器会“监听”特定的事件,当事件发生时,监听器中的相应方法会被调用,从而执行预定义的操作。 事件和监听器是相辅相成的,它们的工作原理如下: 事件源:触发事件的来源。例如,按钮是事件源,点击按钮会触发点击事件 事件对象:当事件发生时,事件源会创建一个事件对象,包含有关事件的信息 注册监听器:监听器需要注册到事件源,以便监听特定的事件。注册后,事件源会在事件发生时通知监听器 事件处理:当事件发生时,事件源会调用监听器中的相应方法,传递事件对象,从而执行预定义的操作 Servlet Event Class 事件(Event)是一个类,封装了与特定事件相关的信息。 基本是构造方法和 get 方法: ServletRequestEvent public class ServletRequestEvent extends EventObject { private static final long serialVersionUID = 1L; private final ServletRequest request; public ServletRequestEvent(ServletContext sc, ServletRequest request) { super(sc); this.request = request; } public ServletRequest getServletRequest() { return this.request; } public ServletContext getServletContext() { return (ServletContext) super.getSource(); } } ServletRequestAttributeEvent public class ServletRequestAttributeEvent extends ServletRequestEvent { private static final long serialVersionUID = 1L; private final String name; private final Object value; public ServletRequestAttributeEvent(ServletContext sc, ServletRequest request, String name, Object value) { super(sc, request); this.name = name; this.value = value; } public String getName() { return this.name; } public Object getValue() { return this.value; } } ServletContextEvent public class ServletContextEvent extends EventObject { private static final long serialVersionUID = 1L; public ServletContextEvent(ServletContext source) { super(source); } public ServletContext getServletContext() { return (ServletContext) super.getSource(); } } ServletContextAttributeEvent public class ServletContextAttributeEvent extends ServletContextEvent { private static final long serialVersionUID = 1L; private final String name; private final Object value; public ServletContextAttributeEvent(ServletContext source, String name, Object value) { super(source); this.name = name; this.value = value; } public String getName() { return this.name; } public Object getValue() { return this.value; } } HttpSessionEvent public class HttpSessionEvent extends EventObject { private static final long serialVersionUID = 1L; public HttpSessionEvent(HttpSession source) { super(source); } public HttpSession getSession() { return (HttpSession) super.getSource(); } } HttpSessionBindingEvent public class HttpSessionBindingEvent extends HttpSessionEvent { private static final long serialVersionUID = 1L; private final String name; private final Object value; public HttpSessionBindingEvent(HttpSession session, String name, Object value) { super(session); this.name = name; this.value = value; } public String getName() { return this.name; } public Object getValue() { return this.value; } } ...

SpringBoot 官方笔记 5Data

Spring Boot integrates with a number of data technologies, both SQL and NoSQL.

魔法方法推开 Python 进阶学习大门

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 热爱 Python Python 是 Guido van Rossum 设计出来的让使用者觉得如沐春风的一门编程语言。2020 年 11 月 12 日,64 岁的 Python 之父宣布由于退休生活太无聊,自己决定加入 Microsoft 的 DevDiv Team,致力于“确保更好地使用 Python”。尽管在国内有些声音在 Diss 着 Python,认为它太简单,只是个脚本语言,但是它的发明者对 Python 的热情,仍然激励着我们坚持对 Python 的热爱。 龟叔是所有编程语言发明者当中头发最多的这位。 奇迹时刻 collection.len()是面向对象语言的写法,len(collection)是 Python 语言的写法,这种风格叫做Pythonic。从前者到后者,就像变魔术一样,一瞬间让人眼前一亮。这个魔术就是 Python 魔法方法,或者叫双下方法,它是用双下划线开头和双下划线结尾的特殊方法,比如obj[key],Python 解释器实际上会转换成obj.__getitem__(key)来运行,但是使用者并无感知。 __getitem__和__len__ __getitem__用来获取数据,__len__用来返回长度,这 2 个魔法方法是 Python 基础,我们通过一副扑克牌来了解: import collections # 定义一副牌 Card = collections.namedtuple('Card', ['rank', 'suit']) class FrenchDeck: # 大小 ranks = [str(n) for n in range(2, 11)] + list('JQKA') # 花色 suits = 'spades diamonds clubs hearts'.split() def __init__(self): # 生成一副牌 self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks] def __len__(self): return len(self._cards) def __getitem__(self, position): return self._cards[position] 本来我们对这副牌什么都不能做,但是由于实现了__len__,可以使用len()函数查看有多少张牌: ...

Flask 项目发布流程

本文继续对 Flask 官方教程进行学习,我就直接跳过 Templates、Static Files、Blog Blueprint 三小节了,因为基本不会在实际项目中用到这些技术,有时间多学习下前端才是。这篇文章把 Make the Project Installable、Test Coverage、Deploy to Production 这三小节汇总来学习。我觉得这是官方给出的一个 Flask 项目发布流程,

Java 官方笔记 4 类和对象

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 创建类 定义类 Bicycle: public class Bicycle { // the Bicycle class has // three fields public int cadence; public int gear; public int speed; // the Bicycle class has // one constructor public Bicycle(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } // the Bicycle class has // four methods public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void applyBrake(int decrement) { speed -= decrement; } public void speedUp(int increment) { speed += increment; } } 创建子类 MountainBike 继承类 Bicycle: ...

JavaWeb 开发基础 ServletSession

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Session 是什么 在 Web 应用程序中,Session(会话)是用于在多个请求之间保持用户状态的一种机制。由于 HTTP 协议是无状态的,每个请求都是独立的,服务器无法直接知道两个请求是否来自同一个用户。Session 通过在服务器端存储用户状态信息,并在客户端使用一个唯一的 Session ID 来标识用户,从而实现状态保持。 Session 工作原理如下: 创建 Session:当用户第一次访问 Web 应用程序时,服务器创建一个新的 Session,并生成一个唯一的 Session ID 发送 Session ID:服务器将 Session ID 发送给客户端,通常通过 HTTP 响应头中的 Set-Cookie 字段 存储 Session ID:客户端浏览器将 Session ID 存储在 Cookie 中,并在后续请求中将其发送回服务器 识别 Session:服务器通过接收到的 Session ID 识别用户的会话,并从服务器端存储中获取相应的 Session 数据 四种主要技术 Cookies Hidden Form Field URL Rewriting HttpSession 1. Cookies(Cookie) Cookie 是存储在客户端浏览器中的小数据片段。它们会随着每个 HTTP 请求一起发送到服务器,可以用来存储会话标识符。 工作原理 当用户第一次访问网站时,服务器生成一个唯一的会话 ID,并将其作为 Cookie 发送到客户端浏览器 浏览器存储这个 Cookie,并在后续请求中将其发送回服务器 服务器使用 Cookie 中的会话 ID 来检索用户的会话数据 ...