Python 元组拆包捡到 8 倍镜快准狠

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 元组拆包 元组是不可变列表,列表是通过索引取值的,元组也是: tuple_test = (1, 2, 3) a = tuple_test[0] b = tuple_test[1] c = tuple_test[2] 但 Python 是出了名的一行代码解决问题,元组拆包就是精髓技术之一: a, b, c = tuple_test print("%s %s %s" % tuple_test) 把元组一一对应拆出来,就叫做元组拆包。拆包有个要求,元组中的元素数量必须跟接受这些元素的空挡数一致,否则会报错: tuple_test = (1, 2, 3) a, b = tuple_test # ValueError: too many values to unpack (expected 2) _占位符 使用_占位符可以解决这个问题: tuple_test = (1, 2, 3) a, b, _ = tuple_test 这样就只获取到部分数据了,这在取函数返回值时特别有用,比如: import os _, filename = os.path.split("/home/dongfanger/.ssh/idrsa.pub") print(filename) # "idrsa.pub" *前缀 当返回值特别多时,_占位符写起来麻烦,可以用*来处理剩下的元素: >>> a, b, *rest = range(5) >>> a, b, *rest (0, 1, [2, 3, 4]) 注意rest是个列表,如果没有足够元素,会返回空列表: >>> a, b, *rest = range(2) >>> a, b, *rest (0, 1, []) *前缀变量能放在任意位置,比如,放在中间: >>> a, *body, c, d = range(5) >>> a, body, c, d (0, [1, 2], 3, 4) 放在前面: ...

SpringBoot 官方笔记 8 其他

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Container Images FROM eclipse-temurin:17-jre as builder WORKDIR application ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} application.jar RUN java -Djarmode=layertools -jar application.jar extract FROM eclipse-temurin:17-jre WORKDIR application COPY --from=builder application/dependencies/ ./ COPY --from=builder application/spring-boot-loader/ ./ COPY --from=builder application/snapshot-dependencies/ ./ COPY --from=builder application/application/ ./ ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"] $ docker build --build-arg JAR_FILE=path/to/myapp.jar . Production-ready Features The spring-boot-actuator module provides all of Spring Boot’s production-ready features. <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> Endpoints Actuator endpoints let you monitor and interact with your application. Spring Boot includes a number of built-in endpoints and lets you add your own. For example, the health endpoint provides basic application health information. ...

DRF 比 Django 的认证和权限高在哪里

Django 可以用LoginRequiredMixin和PermissionRequiredMixin给类视图添加认证和权限,DRF 做了高级封装,提供了更简洁的实现方式。我们通过继续学习官网教程来进行了解。

Java 官方笔记 7 接口

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 接口 接口只能包含:constants, method signatures(abstract), default methods, static methods, and nested types 方法体只存在于:default methods and static methods 接口不能实例化,只能被类实现,或者被其他接口继承(接口可以多继承)。 定义接口: public interface OperateCar { // constant declarations, if any // method signatures // An enum with values RIGHT, LEFT int turn(Direction direction, double radius, double startSpeed, double endSpeed); int changeLanes(Direction direction, double startSpeed, double endSpeed); int signalTurn(Direction direction, boolean signalOn); int getRadarFront(double distanceToCar, double speedOfCar); int getRadarRear(double distanceToCar, double speedOfCar); ...... // more method signatures } 类实现接口: ...

JavaWeb 开发进阶 SpringMVC 简介

Spring MVC,又称为 Spring Web MVC,名字来源于 Spring 模块spring-webmvc,是一个基于 Servlet API 开发的 Web 框架。

Python 数据模型与 Python 对象模型

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 数据模型==对象模型 Python 官方文档说法是“Python 数据模型”,大多数 Python 书籍作者说法是“Python 对象模型”,它们是一个意思,表示“计算机编程语言中对象的属性”。这句话有点抽象,只要知道对象是 Python 对数据的抽象,在 Python 中万物皆对象就可以了。 官方文档严谨说法,Python 程序中的所有数据都是用对象或对象之间的关系来表示的。 对象三要素 对象有三个要素:编号(identity)、类型(type)、值(value)。 identity 编号就是对象的内存地址,从创建后就不会改变。is运算符用来比较 2 个对象的编号。id()函数返回对象编号的整数表示。 identity 也可以翻译为身份,对象身份。 type 类型决定了可以对对象做哪些操作,也定义了对象的可能值,比如int和bool类型的值就不一样。type()函数返回对象类型。很多人会误以为 Python 是弱类型语言,其实 Python 是强类型语言,这个误解的真实原因是,Python 不需要编译,不需要提前知道变量的类型,在运行时才检查类型,这应该叫做动态语言。 JavaScript 是弱类型语言,在 Python 中1+"2"会运行失败,在 JavaScript 中能运行成功。 类型在创建后也不会改变,虽然可以进行类型转换,但转换实际会产生新对象: a = 1 print(id(a)) print(id(str(a))) print(id(a)) 结果为: 140715000207008 2136059506160 140715000207008 value 对象三要素中唯一能改变的就只有值了。官网有一句正确的废话:允许改变值的对象是mutable(可变的),不允许改变值的对象是immutable(不可变的)。它的意义在于当不可变对象的值是对可变对象的引用时,该如何判断对象的可变性?结论是不可变对象仍然是不可变的,因为这个引用是不能变的,但是我们通常会认为这个不可变对象的值是可变的,尤其是对象容器。对象类型也会决定是否可变,比如numbers、strings、tuples是不可变的,dictionaries、lists是可变的。 对象容器 有些对象包含了对其他对象的引用,这叫做containers对象容器,比如tuples、lists、dictionaries。大多数情况下,我们说容器的值,说的是引用的对象的值,而不是引用编号。但讨论容器可变性时,则仅仅是指容器直接包含的引用编号。比如tuple是不可变的,如果它包含了对一个可变对象的引用后,当该可变对象改变时容器的值也会改变。 对象回收 对象不会被显式销毁,但是它们会被当做垃圾回收,只要不存在对象引用,这就是 Python 垃圾回收机制!垃圾回收机制比较复杂,比如循环引用,实际上已经没有使用了,但是还存在引用等,涉及到算法规则,等写完 Python 进阶,在写 Python 原理时做进一步研究。 Python 垃圾回收机制不是银弹,不能解决所有问题,所以在引用外部资源,比如打开文件后,我们需要注意显式 close,防止资源始终占用内存,无法释放,造成内存泄漏。close 除了手动调用close()方法外,也可以使用with来自动 close。 使用try...except可能会让对象继续存活。 类型决定一切 对象的类型几乎决定了对象的一切行为,甚至是对象编号,比如对于不可变类型: a = 1 b = 1 a和b可能会指向同一个值为1的对象,也可能会指向两个不同的值为1的对象,这取决于具体实现。 但是对于可变类型: c = [] d = [] c和d一定会指向两个不同的单独的空列表。 ...

SpringBoot 官方笔记 7IO

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Caching Spring Boot auto-configures the cache infrastructure as long as caching support is enabled by using the @EnableCaching annotation. import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; @Component public class MyMathService { @Cacheable("piDecimals") public int computePiDecimal(int precision) { ... } } Before invoking computePiDecimal, the abstraction looks for an entry in the piDecimals cache that matches the i argument. If an entry is found, the content in the cache is immediately returned to the caller, and the method is not invoked. Otherwise, the method is invoked, and the cache is updated before returning the value. ...

DRF 类视图让你的代码 DRY 起来

刚开始写views.py模块的代码,一般都是用def定义的函数视图,不过 DRF 更推荐使用class定义的类视图,这能让我们的代码更符合 DRY(Don’t Repeat Yourself)设计原则:

Java 官方笔记 6 继承

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 继承 Java 只有单继承,最顶级的父类是 Object。 子类会继承父类的 fields 和 methods,而不会继承 constructors,因为 constructors 不属于 methods,但是子类可以通过 super 调用父类的 constructor。 子类继承父类的范围是:public、protected、package-private 隐式转换,子类转父类(只有 1 个爸爸): Object obj = new MountainBike(); 显示转换,父类转子类(有多个子女,所以要明确指定): MountainBike myBike = (MountainBike)obj; 类有 field,而接口没有,所以在多继承时就有问题:如果多个类有相同的 field,那么子类将不知道用哪一个,而接口不存在这个问题。Java 不支持继承多个类,但是可以实现多个接口。 重载 子类的方法跟父类有完全相同的签名和返回类型(也可以是子类),将会覆盖父类方法Override。 如果子类定义了 1 个 static 方法,跟父类完全相同,那么父类方法会被隐藏Hide。 Override 和 Hide 是不同的: public class Animal { public static void testClassMethod() { System.out.println("The static method in Animal"); } public void testInstanceMethod() { System.out.println("The instance method in Animal"); } } public class Cat extends Animal { public static void testClassMethod() { System.out.println("The static method in Cat"); } public void testInstanceMethod() { System.out.println("The instance method in Cat"); } public static void main(String[] args) { Cat myCat = new Cat(); Animal myAnimal = myCat; // 隐式转换 Animal.testClassMethod(); // 调的父类 myAnimal.testInstanceMethod(); // 父类对象引用,还是调的子类 } } The static method in Animal The instance method in Cat Override 只会调子类方法,而 Hide 取决于调用方是父还是子,比如这里的 myCat,隐式转换为父类 Animal 后,会调父类的 static 方法,而调的实例方法却是子类的。(如果不是隐式转换,而是直接给父类实例化,那肯定还是调父类方法) ...

JavaWeb 开发基础 ServletFilter

本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 Filter 是什么 Filter 用于对请求和响应进行预处理和后处理。Filter 链(Filter Chain)允许多个 Filter 依次处理同一个请求和响应。 Filter 的使用场景 日志记录:记录请求和响应的详细信息,例如请求时间、响应时间、请求参数等 安全检查:检查用户是否有权限访问特定资源,例如验证用户身份、检查用户角色等 压缩:对响应内容进行压缩,例如使用 GZIP 压缩响应数据 字符编码设置:设置请求和响应的字符编码,例如将请求和响应的字符编码设置为 UTF-8 输入验证:对请求参数进行验证,例如检查参数是否为空、参数格式是否正确等 Filter Interface Filter 接口有 3 个方法: package javax.servlet; import java.io.IOException; public interface Filter { void init(FilterConfig var1) throws ServletException; void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException; void destroy(); } 容器在启动时创建 Filter 实例,并调用其init(FilterConfig filterConfig)方法进行初始化。每次请求到达时,容器调用 Filter 的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法进行过滤。容器在关闭时调用 Filter 的destroy()方法进行清理。 ...