作者小头像 Lv.1
33 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据
个人勋章
TA还没获得勋章~
成长雷达
0
33
0
0
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据

达成规则

发布时间 2021/07/06 15:43:54 最后回复 @Wu 2021/08/09 16:36:10 版块 社区活动
6949 154 1
他的回复:
华为云ID:ypmily+第3周笔记+笔记内容 # 第五章 --- ### 5.1函数式编程 1. 函数式编程 - 在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿什么东西做什么事情”。相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法--- **强调做什么,而不是以什么形式做。** 2. 做什么,而不是怎么做 - 对于Runnable的匿名内部类用法,可以分析出几点内容: - Thread类需要Runnable接口作为参数,其中的抽象run方法是用来指定线程任务内容的核心; - 为了指定run的方法体,不得不需要Runnable接口的实现类; - 为了省去定义一个Runnablelmpl实现类的麻烦,不得使用匿名内部类; - 必须覆盖重写抽象run方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错; - 而实际上,似乎只有方法体才是关键所在。 - 我们真正希望做的事情是:将run方法体内的代码传递给Thread类知晓。 - **我们只是为了做这件事情而不得不创建一个对象。** 3. 本质 - **传递一段代码** ----这才是我们真正的目的。而创建对象只是受限于面向对象语法而不得不采取的一种手段方式 4. 解决 - 匿名内部类存在的一个问题是,即便匿名内部类的实现非常简单,例如只包含一个抽象方法的接口,那么匿名内部类的语法仍然显得比较冗余。 - 解决方法∶可以使用JDK 8中新增的Lambda表达式,这种表达式只针对有一个抽象方法的接口实现,以简洁的表达式形式实现接口功能来作为方法参数。 ``` new Thread(() -> System.out.println("多线程任务执行!")).start( ); ``` - 这段代码和刚才的执行效果是完全一样的,可以在1.8或更高的编译级别下通过。从代码的语义中可以看出:我们启动了一个线程,而线程任务的内容以一种更加简洁的形式被指定。 - 不再有“不得不创建接口对象”的束缚,不再有“抽象方法覆盖重写”的负担,就是这么简单! --- ### 5.2函数式接口 1. Lambda表达式基本语法格式 ``` (数据类型 参数名,数据类型 参数名....) →>.{表达式主体} ``` - 参数名:用来向表达式主体内部实现的接口方法传入参数。多个参数之间用逗号分隔,可以省略数据类型,只有一个参数时还可以省略小括号 - -> 表示Lambda表达式箭牌,用来指定参数数据指向,不能省略 - 本质就是接口中抽象方法的具体实现。如果只有一条语句,可以省略大括号;在Lambda表达式主体中只有一条return语句时,也可以省略return关键字 2. 是否可以使用Lambda代替所有匿名内部类? - 接口中有且只有一个抽象方法时才能使用Lamdba表达式代替匿名内部类。这是因为Lamdba表达式是基于函数式接口实现的。 - 所谓函数式接口是指有且仅有一个抽象方法的接口,Lambda表达式就是Java中函数式编程的体现,只有确保接口中有且仅有一个抽象方法,Lambda表达式才能顺利地推导出所实现的这个接口中的方法。 3. 定义︰ - 在JDK 8中,接口上标注有@FunctionalInterface注解的即为函数式接口,在函数式接口内部有且只有一个抽象方法。 4. 说明: - @FunctionalIlnterface注解只是显示的标注了接口是一个函数式接口,并强制编辑器进行更严格的检查,确保该接口是函数式接口。 5. JDK 1.8之前已有的一些函数式接口: - java.lang.Runnable - java.util.concurrent.Callable - java.security.PrivilegedAction - java.util.Comparator - java.io.FileFilter - java.nio.file.PathMatcher - java.lang.reflect.InvocationHandler - java.beans.PropertyChangeListener - java.awt.event.ActionListener - javax.swing.event.ChangeListener 6. JDK 1.8新增加的函数接口 - ava.util.function包下包含了很多类,用来支持Java的函数式编程。 --- ### 5.3方法引用 1. Lambda表达式的简化 - 复习: Lambda表达式的省略写法(进一步在Lambda表达式的基础上继续简化) 1. 如果Lambda表达式的方法体代码只有一行代码,可以省略大括号不写,同时要省略分号! 2. 如果Lambda表达式的方法体代码只有一行代码,可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写 3. 参数类型可以省略不写。 4. 如果只有一个参数,参数类型可以省略,同时()也可以省略。 - 除了以上简化规则,我们还可以使用“方法引用”进一步简化Lambda表达式 2. 方法引用(1) - 说明: Lambda表达式的主体只有一条语句时,程序不仅可以省略包含主体的花括号,还可以通过英文双冒号”:”的语法格式来引用方法和构造器(即构造方法)。 - 作用:可以进一步简化Lambda表达式的书写,其本质都是对Lambda表达式的主体部分已存在的方法进行直接引用,主要区别就是对普通方法与构造方法的引用而已。 3. 类名引用静态方法 - 定义︰类名引用静态方法也就是通过类名对静态方法的引用,该类可以是Java自带的特殊类,也可以是自定义的普通类。 ``` //3.简化lambda表达式 printAbs(-8,(n)->Math.abs(n) ); //4.使用方法引用简化lambda表达式 printAbs(-8,Math::abs); ``` 4. 对象名引用方法 - 定义∶对象名引用方法指的是通过实例化对象的名称来对其方法进行的引用。 ``` //使用Lambda表达式方式 printUpper("Hello", t -> stu.printUpperCase(t)); //使用方法引用的方式 printUpper("Hello", stu::printUpperCase); ``` 5. 构造器引用方法 - 定义︰构造器引用指的是对类自带的构造器的引用。 ``` // 使用Lambda表达式方式 printName("张三", (name) -> new Person(name)); // 使用构造器引用的方式 printName("张三", Person::new); ``` 6. 类名引用普通方法 - 定义:类名引用普通方法指的是通过一个普通类的类名来对其普通方法进行的引用。 ``` // 使用Lambda表达式方式 printUpper(new StringUtils1(), "Hello", (object, t) -> object.printUpperCase(t)); // 使用方法引用的方式 printUpper(new StringUtils1(), "Hello", StringUtils1::printUpperCase); ``` --- # 第六章 --- ### 1. 枚举类的定义 1. 枚举类的定义 - 。 - 定义枚举类型其实就是在定义一个类,只不过很多细节由编译器帮你补齐了,所以,某种程度上enum关键词的作用就像是class 或interface 。 - 当使用enum定义枚举类型时,实际上所定义出来的类型是继承自java.lang.Enum类。而每个被枚举的成员其实就是定义的枚举类型的一个实例,它们都被默认为final。无法改变常数名称所设定的值,它们也是public和static的成员,这与接口中的常量限制相同。可以通过类名称直接使用它们。 --- ### 2. 枚举类的结构 1. 枚举像普通的类一样可以添加属性和方法,可以为它添加静态和非静态的属性或方法。 --- ### 3. 枚举的应用 - 枚举是一种类型,用于定义变量,以限制变量的赋值;赋值时通过“枚举名.值”取得枚举中的值。 - 枚举类的常用API如下: 步骤序号 | 步骤详解 ---|--- values() | 取得所有的枚举成员实例,并以数组方式返回 compareTo() | 比较两个枚举对象在枚举时的顺序。 ordinal() | 依枚举顺序得到位置索引,默认以0开始 --- ### 5. 包装类定义 1. 为什么需要包装类? - 虽然Java是面向对象的编程语言,但它所包含的8种基本数据类型却不支持面向对象的编程机制(没有属性和方法)。在Java中,很多类的方法都需要接收引用类型的对象,此时就无法将一个基本数据类型的值传入。为了解决这样的问题,JDK中提供了一系列的包装类,通过这些包装类可以将基本数据类型的值包装为引用数据类型的对象。 2. 包装类的继承关系 ```
发布时间 2021/07/06 15:43:54 最后回复 @Wu 2021/08/09 16:36:10 版块 社区活动
6949 154 1
他的回复:
华为云ID:ypmily+第2周笔记+笔记内容 # 第三章 --- ### 1.1 子类和父类同名方法 1. 子类和父类同名方法 - 子类和父类同名方法,方法重写前提:需要有继承关系 - 方法重写表现: 1. 方法名必须相同 2. 参数列表必须相同 3. 返回值类型必须相同 4. 修饰符:范围可以扩大或相同,但是不能缩小public > protected > default 2. 方法重写 - 不能重写父类的private方法,如果定义的话只是定义了一个新方法,不是方法重写 3. 运行时多态 - 后期绑定 如果被调用的方法在编译期无法被确定下来, 只能够在程序运行期根据实际的类型绑定相关的方法,这种绑定方式也被称之为后期绑定 - 运行时多态 方法重写是根据实际的类型决定调用哪个重写的方法,发生在运行期间,也叫做运行时多态 --- ### 1.2 static修饰同名方法 1. 子类和父类static修饰的同名方法 - static修饰的方法是静态方法,也叫做类方法 - 使用private或static或final修饰的变量或者方法,是早期绑定 > **不是方法重写** --- ### 1.3 解耦合 1. 动态绑定和解耦合简介 - 动态绑定 在运行时根据具体对象的类型进行绑定,也就是后期绑定 - 解耦合简介 解耦合,字面意思就是解除耦合关系设计的核心思想: 尽可能减少代码耦合,如果发现代码耦合,就要采取解耦技术数据模型,业务逻辑和视图显示三层之间彼此降低耦合 2. 解耦合简介 - 父子关系和夫妻关系的区别 - 从编程角度,父子关系是不能拆分的从编程角度,夫妻关系是可以拆分的 --- ### 1.4同名变量 > 当出现同名变量时,子类的变量不在继承父类的同名变量 --- ### 1.5 方法重载和方法重写的区别 1. 方法重载和方法重写区别和应用 - 多态的具体表现 名称 | 方法重载 | 方法重写 ---|---|--- 类 | 一个类 | 继承关系 方法名 | 相同 | 相同 方法参数 | 参数个数不同、参数类型不同、参数顺序不同 | 参数列表相同 返回值类型 | 可以不同 | 必须相同 调用方式 | 参数决定 | 创建的实际对象决定 static修饰 | 是方法重载 | 不是方法重写 > **方法重载:早期绑定,编译时多态** > **方法重写:后期绑定,运行时多态** --- ### 1.7抽象类的定义 1. 为什么需要抽象类? 动物Animal都有自已的行为,小鸟和老虎继承了动物的行为,但小鸟和老虎的行动方式不一样。在动物类中能给出行动的具体实现吗? 2. 什么是抽象类? 使用abstract关键字修饰的方法叫做抽象方法,抽象方法没有方法体。当一个类中包含了抽象方法,那么该类也必须使用abstract关键字来修饰,这种使用abstract关键字修饰的类就是抽象类。 3. 抽象类及抽象方法定义的语法格式: ``` [修饰符] abstract class类名 { //定义抽象方法 [修饰符]abstract方法返回值类型方法名([参数列表]); //其他方法或属性 } ``` > **拥有抽象方法的类,必须是抽象类** > **抽象类可以拥有构造方法,但是不能通过new +构造的方式创建对象,主要是完成对抽象类本身的一些初始化工作** --- ### 1.8抽象类的作用 1. 抽象类的作用 - 抽象类的作用类似于“模板”,其目的是方便开发人员根据抽象类的格式来修改和创建新类。 - 抽象类主要用于继承,有利于程序的扩展。 2. 抽象类的特点︰ 1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。 2. 抽象类中,可以有构造器,是供子类创建对象时,初始化父类成员使用的。 3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。 4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类,不然编译无法通过而报错。 5. 抽象类中的抽象方法不能用private、final、static修饰 6. 抽象类存在的意义是为了被子类继承,抽象类体现的是模板思想。 --- ### 1.9抽象类设计和场景 1. 抽象类的设计和场景 - 我们现在使用抽象类设计一个模板模式的应用·场景: - 新司机:开门,点火,双手紧握方向盘,刹车,熄火 - 老司机:开门,点火,右手握方向盘左手抽烟,刹车,熄火 --- ### 2.1接口的定义 1. 什么是接口? - 接口就是某个事物对外提供的一些功能的声明 - 可以利用接口实现多态,同时接口也弥补了Java单一继承的弱点 - 使用interface关键字定义接口 --- ### 2.2接口的特点和作用 1. 接口的特性 - JDK 1.8之前接口的特性: 1. 接口允许多继承 2. 接口没有构造方法 3. 接口中的属性默认是用public static final修饰 4. 接口中的方法默认是用public abstract修饰的 5. 接口继承接口用extends,不能implement - JDK 1.8之后接口的语法: ``` [修饰符] interface 接口名[extends父接口1,父接口2....] { [public] [static] [final] 常量类型 常量名 = 常量值; [public] [abstract]方法返回值类型 方法名([参数列表]); [public] default 方法返回值类型 方法名([参数列表]) { //默认方法的方法体 } [public] static 方法返回值类型 方法名 ([参数列表]) { //类方法的方法体 } } ``` - JDK 1.8之后接口的特性: 1. 在接口内部可以定义多个常量和抽象方法,定义常量时必须进行初始化赋值,定义默认方法和静态方法时,可以有方法体。 2. 在接口中定义常量时,可以省略“public static final"修饰符,接口会默认为常量添加“public staticfinal"修饰符。与此类似,在接口中定义抽象方法时,也可以省略“public abstract"修饰符,定义default默认方法和static静态方法时,可以省略“public"修饰符,这些修饰符系统都会默认进行添加。 2. 接口的作用 - 接口表示一种能力,例如:“做这项工作需要一个钳工/木匠/程序员” 钳工是一种“能力”,我们并不关心具体是谁! - 接口是一种能力 体现在接口的方法上 - 面向接口编程 程序设计 1. 关心实现类有何能力,而不关心实现细节 2. 面向接口的约定而不考虑接口的具体实现 3. 小结 1. 从JDK 8开始,接口中的方法除了包含抽象方法外,还包含默认方法和静态方法,默认方法和静态方法都可以有方法体,并且静态方法可以直接通过“接口.方法名”来调用。 2. 当一个类实现接口时,如果这个类是抽象类,只需实现接口中的部分抽象方法即可,否则需要实现接口中的所有抽象方法。 3. 一个类可以通过implements关键字同时实现多个接口,被实现的多个接口之间要用英文逗号(,)隔开。 4. 接口之间可以通过extends关键字实现继承,并且一个接口可以同时继承多个接口,接口之间用英文逗号(,)隔开。 5. 一个类在继承一个类的同时还可以实现接口,此时,extends关键字必须位于implements关键字之前。 --- ### 2.3接口的设计 1. 接口的设计 - 面向接口编程 - 需求:开发打印机 1. 墨盒:彩色、黑白-纸张类型:A4、B5 2. 墨盒和纸张都不是打印机厂商提供的 3. 打印机厂商要兼容市场上的墨盒、纸张 - 结果: 1. 使用黑白墨盒在A4纸上打印。 2. 使用彩色墨盒在B5纸上打印。 3. 使用彩色墨盒在A4纸上打印。 --- ### 2.5抽象类is-a 1. 抽象类的特点 1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。 2. 抽象类中,可以有构造器,是供子类创建对象时,初始化父类成员使用的。 3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。 4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则子类也必须定义成抽象类,编译无法通过而报错。 5. 抽象类中的抽象方法不能用private、final、static修饰 6. 抽象类存在的意义是为了被子类继承,抽象类体现的是模板思想。 2. 何时使用继承? - 继承与真实世界类似,只要说“猫是哺乳动物”,猫的很多属性、行为就不言自明了。 - **符合is-a关系的设计使用继承** - 继承是代码重用的一种方式,将子类共有的属性和行为放到父类中,子类与父类是is-a关系。 --- ### 2.6接口has-a 1. 接口的特点 1. USB接口本身没有实现任何功能 2. USB接口规定了数据传输的要求 3. USB接口可以被多种U设备实现 2. 可以使用Java接口来实现 编写USB接口 : **根据需求设计方法** 实现USB接口 : **实现所有方法** 使用USB接口 : **用多态的方式使用** 3. is-a与has-a - 实现防盗门功能 防盗门是一个门 -> is-a的关系 - 防盗门有一个锁 上锁 -> has-a的关系 开锁 --- ### 2.7猜数字游戏实战 1. 猜数字游戏案例 - 需求: - 编写程序随即生成一个1~10之间的随机数。程序提示用户输入一个数字,不停猜测,直到猜对为止。最后输出猜测的数字,和猜测的次数。并且如果没有猜中要提示用户输入的值是大了还是小了。 --- # 第四章 --- ### 1.1包的定义和导入 1. 包的定义 - 为什么需要包? - Windows树形文件系统 文档分门别类,易于查找和管理 使用目录解决文件同名冲突问题 - 如何存放两个同名的类而不冲突? 使用包: package 包对应Java源文件的目录结构 2. 包的命名 - 包名由小写字母组成,不能以圆点开头或结尾 - package mypackage; - 包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名 - package net.javagroup.mypackage; - 包名后续部分,依不同机构内部的规范不同而不同 - package net.javagroup.research.powerproject; 3. 包的作用 - 允许类组成较小的单元(类似文件夹),易于找到和使用相应的文件 - 防止命名冲突区分名字相同的类 - 有助于实施访问权限控制 4. import导包 - 为了使用不在同一包中的类,需要在Java程序中使用import关键字导入这个类。 - import包名.类名; ``` - 例如: //系统包java.util,*指包中的所有类 import java.util.*; //导入java.util包中所有类 import com.huawei.example.Book; //导入指定包中指定类 //自定义包com.huawei.example Book指包中的Book类 ``` 5. import 导包 使用包的注意事项 - 一个类同时引用了两个来自不同包的同名类,必须通过完整类名来区分 - 每个包都是独立的,顶层包不会包含子包的类 - package和import的顺序是固定的 - package必须位于第一行(忽略注释行) - 只允许有一个package语句 - 其次是import - 接着是类的声明 --- ### 1.2系统常用包 1. 作为Java语言的使用者,我们可以感受到Java语言的优势(平台无关、面向对象、多线程、高效易扩展等),而且它有很多已经实现的类库可以供我们直接使用, **这些类库都是以jar包的形式提供的。** 它们共同构成了Java API,为编程者实现了各种常用操作的方法,为程序员编写Java程序代码带来了许多方便。 2. 常见的包 包名 | 内容概述 ---|--- java.lang | 提供java语言程序设计的基础类 java.util | 提供处理日期、时间、随机数生成等各种使用工具的类 java.io | 提供与输入输出相关的类 java.net | 提供实现网络操作相关的类 java.sql | 提供使用访问并处理存储在数据库中的数据的API java.nio | 为输入输出提供缓冲区的类 java.text | 提供处理文本、日期、数字和消息的类和接口 java.awt | 包含用于创建用户界面和绘制图形图像的所有类 javax.swing | 提供一组与AWT功能相同的纯java的组件类 3. java.lang.* - **java.lang包是java语言体系中其他所有类库的基础,已经内嵌到java虚拟机中 **,而且以对象的形式创建好了,所以我们在使用java.lang包时不需要再使用import将其导入,可以直接使用java.lang包中的所有类,以及直接引用某个类中的常量、变量和方法。 4. lang包下常用的类: - String:封装了与字符串类型相关的操作方法 - Class:用于描述正在运行的java应用程序中的类和接口的状态 - ClassLoader:用于加载类的对象 - Enum:用于定义枚举类型 - Math:用于实现基本数学运算 - Number:抽象类,是基本数据类型类的父类 - Object:所有java类的根类 - Package:封装了有关java包的实现和规范的版本信息 - Runtime: Runtime类对象使java应用程序与其运行环境相连接 - StringBuffer:用于可变字符串的操作 - StringBuilder:创建可变的字符串对象 - System:封装了一些与java虚拟机系统相关的方法 - Thread:创建和控制线程 - ThreadGroup:创建和控制线程组 - Throwable:定义了java中的所有错误或者异常的父类 - Process:定义一个进程process对象,通过Runtime类中的exec方法启动该进程对象 5. lang包下常用的接口: - Appendable:用于追加字符串 - Cloneable:用于复制类对象 - Runnable:用于实现类对象具有线程功能 - Comparable:用于类对象的排序 6. java.util.* : - 包含集合框架、collection类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈Stack类、向量Vector类等)。集合类、时间处理模式、日期时间工具等各类常用工具包。 7. java.io.* - Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。 8. .java.net.* - 主要用于处理以下抽象: - 地址:也就是网络标识符,如IP地址。 - 套接字:也就是基本双向数据通信机制。 - 接口:用于描述网络接口。 - URI:表示统一资源标识符。 - URL:表示统一资源定位符。 - 连接:表示到URL所指向资源的连接。 - InetAddress类是对IP(Internet 协议)地址的抽象。它拥有两个子类: - 用于IPv4地址的: Inet4Address。 - 用于IPv6地址的: Inet6Address。 8. java.sql.* - 提供使用Java语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的API。此API包括一个框架,凭借此框架可以动态地安装不同驱动程序来访问不同数据源。 --- ### 1.3创建jar包和引用 1. 使用Eclipse把项日导成jar包. 2. 用命令创建jar包 1. 编写java源码文件 2. 使用javac编译生成class 文件 3. 将所有要打包的class文件存在的目录以及依赖的jar包全部放在一个根文件夹里面(比如bin) 4. 编写MANIFEST清单文件,指定程序入口以及其他添加的依赖的jar包 5. 执行打包指令: jar {ctxu}[vfmOM] [jar-文件名][manifest-文件名][-C目录]文件名... - 例如: jar cvfm xxx.jar MANIFEST.MF -C bin/ . 命令含义: - -C创建新的JAR文件包 - -v生成详细报告并打印到标准输出 - -f指定JAR文件名,通常这个参数是必须的 - -m指定需要包含的MANIFEST清单文件 3. MANIFEST文件介绍: - MANIFEST文件对于jar打包都是必须的。MANIFEST文件描述了打包后的jar文件的详细信息,存在于打包后的META-INF的文件夹。一个简单的MANIFEST文件主要内容如下: ``` Manifest-Version: 1.0 Created-By: 1.8.0_172 (Oracle Corporation) Main-Class: com.huawei.main.TestMain ``` - Manifest-Version,Main-Class,Class-Path这三个属性在制作jar包时非常重要 - Manifest-Version是版本号。 - Main-Class则是jar包的入口程序,指定运行的类的全称(一定要包含包名),这样可以使用java -jar name.jar直接运行jar包。 - Class-Path是指的打包时需要依赖的其他jar包,打包的时候自己的程序中也可能含有其他的jar包所以要添加依赖.。注意:每个MANIFEST属性冒号与内容之间都有一个空格,并且写完后最后还要留有一行空行,不然运行时还是出现找不到主清单属性的错误。 --- ### 1.4访问权限控制 1. 在Java中,针对类、成员方法和属性提供了四种访问级别,分别是private、default、protected 和public。 - private(当前类访问级别)∶对于私有成员变量和方法,只有在本类中创建该类的对象时,这个对象才能访问自己的私有成员变量和类中的私有方法。 - default(包访问级别)∶类的成员变量和方法什么修饰符都没有,又叫包修饰符,只有类本身成员和当前包下类的成员可以访问。 - protected(子类访问级别)∶用protected修饰的成员变量和方法能被该类的成员以及其子类成员访问还可以被同一个包中其他类的成员访问。 - public(公共访问级别)︰这是一个最宽松的访问控制级别,如果一个类或者类的成员被public访问控制符修饰,那么这个类或者类的成员能被所有的类访问,不管访问类与被访问类是否在同一个包中。 2. 作用域/修饰符 | 同一个类中 | 同一个包中 | 子类中 | 任何地方 ---|---|---|---|--- private | 可以| | | 默认修饰符 | 可以| 可以 | | protected | 可以| 可以 | 可以 | public | 可以| 可以 | 可以 |可以 3. 访问级别 - private -> default -> protected -> public > 访问控制级别由小到大 4. 访问权限的使用建议 - 成员变量使用private ,隐藏细节 - 构造方法使用public ,方便创建对象。 - 成员方法使用public ,方便调用方法。 --- ### 1.6普通内部类的定义 1. 定义 - 在Java中,允许在一个类的内部定义类,这样的类称作内部类,这个内部类所在的类称作外部类。 - 在一个类中除了可以定义成员变量、成员方法,还可以定义类,这样的类被称作成员内部类。 2. 分类 - 成员内部类 - 局部内部类 - 静态内部类 - 匿名内部类 3. 说明 - 在成员内部类中,可以访问外部类的所有成员,包括成员变量和成员方法;在外部类中,同样可以访问成员内部类的变量和方法。 4. 格式 - 外部类名.内部类名变量名=new 外部类名().new内部类名(); --- ### 1.7局部内部类 1. 定义︰ - 局部内部类,也叫做方法内部类,就是定义在某个局部范围中的类,它和局部变量一样,都是在方法中定义的,其有效范围只限于方法内部。 2. 说明: - 在局部内部类中,局部内部类可以访问外部类的所有成员变量和方法,而局部内部类中的变量和方法却只能在创建该局部内部类的方法中进行访问。 --- ### 1.8静态内部类 1. 定义: - 所谓静态内部类,就是使用static关键字修饰的成员内部类。 2. 说明: - 静态内部类在成员内部类前增加了static关键字,在功能上,静态内部类中只能访问外部类的静态成员,同时通过外部类访问静态内部类成员时,可以跳过外部类从而直接通过内部类访问静态内部类成员。 3. 格式 - 外部类名.静态内部类名变量名=new外部类名.静态内部类名(); --- ### 1.9匿名内部类 1. 定义: - 匿名内部类其实就是没有名称的内部类。 2. 说明: - 在调用包含有接口类型参数的方法时,通常为了简化代码,可以直接通过匿名内部类的形式传入一个接口类型参数,在匿名内部类中直接完成方法的实现。 3. 格式: ``` new 父接口() { //匿名内部类实现部分 } ``` 4. 注意: - 从JDK 8开始,允许在局部内部类、匿名内部类中访问非final修饰的局部变量,而在JDK8之前,局部变量前必须加final修饰符,否则程序编译报错。 ---
发布时间 2021/07/12 16:29:03 最后回复 wuyicom 2021/08/31 17:23:21 版块 社区活动
6083 70 0
他的回复:
华为云ID:ypmily+第2周笔记(入门篇) --- ### 3.1 Python中的数据类型 ##### 数值 1. 数据和容器 - Python中提供了六种内置的数据类型: - **Number(数值)、String (字符串)、List(列表)、Tuple (元组).Dictionary(字典)、 Set(集合)** - 这些数据类型如同容器一般用于存放数据。 2. Python中的数据类型 - 这些数据类型不仅可以提高Python的运行效率,还极大地提高了我们的开发效率。并且它们让Python的操作变得简单便捷。 - Python中的数据类型可以做以下几种分类: - 有序:可以使用下标(索引)访问元素。 - 无序:不可以使用用下标(索引)访问元素。 - 可变:可以被修改。 - 不可变:不可以被修改。 3. 结构分类 ||有序|无序| |:---:|:---:|:---:| |可变|列表|字典、集合| |不可变|字符串、元组|数值| 4. Number(数值) - Python3里数值类型支持: |类型|值|范围| |:--:|:--:|:--:| |int|1,2|(-oo,+ oo)| |float|1.2,3.7E-2|(-oo,+ oo)| |bool|True|[True,False]| |complex|x+yj|×是实数部分,y是虚数部分| > **bool在python3里面继承int类型** 5. 复数 - 复数由实数部分和虚数部分构成。 - 虚数不能单独存在,它们总是和一个值为0.0的实数部分一起构成一个复数。 - 虚数部分必须有后缀j或J。 - 实数部分和虚数部分都是浮点数。 6. 数值的计算 - 数值类型的基本操作: - 加(+) - 减(-) - 乘(*) - 除(/) - 取余(/) - 取整(%,//) - 乘方(**) - 如果不同的类型的数字(如int,float)进行运算,则结果类型为精度较高的那个类型。 7. Python中的计算函数 - Python中内置了很多用于数值计算的函数。 - 求绝对值: abs(x); - 四舍五入: round(x); - 返回两个数值的商和余数: divmod(y,x) - 一求取最大值:max、min - 求和: sum 8. math模块 - Python math模块提供了许多对浮点数的数学运算函数。 - 同时还提供了cmath模块,cmath模块的函数跟math模块函数基本一致,区别是cmath模块运算的是复数,math模块运算的是数学运算。 - math模块常用方法: - 三角函数: sin、cos、tanh - 获取绝对值:fabs - 向上取整: ceil; - 向下取整:floor - 获取阶乘: factorial - x的y次方:pow ##### 字符串 1. 字符和字符串 - 字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。 - 字符串是编程语言中最常见的一种数据类型由字符组成,具有以下特征: - 有限的字符集合; - 可以由汉字、数字、字母、符号组成; - 一般有引号包裹。 2. Python中的String (字符串) - Python中字符串是一个由多个字符组成的序列 - Python中没有字符。 - 字符的个数即为字符串的长度(可用len函数查看) - 单个字符被认作长度为1的字符串。 - Python中的字符串是有序且不可变的。 3. 创建一个字符串 - 在Python中声明一个字符串有三种方式: - 使用单引号('...')创建: 'Python'; - 使用双引号("...")创建:"Python" ; - 使用三引号(""...."", """..."""): '''Python'''; - 除了三种声明方式以外,还可以通过类型转化的方式str(obj),生成字符串。 - 使用单引号和双引号创建的字符串是一样的,不能换行;使用三引号创建的字符串可以是很长的字符串(可换行)。 > **引号成对出现** 4. 特殊的字符串–-转义字符 - 在字符串中因为有一些字符因为本身具备一些功能,所以没有办直接使用,如双引号和单引号。此时可以使用转义字符来实现这些符号的使用。 - 转义字符:\ - 可以屏蔽符号原有的功能("张三说:\"这是一个字符串\""); - 加入特殊字母可以使用特殊功能; - 输出\,可以使用\\. 5. 常见的转义字符 |符号|作用| |---|---| |\n|换行| |\t|水平制表(HT)(跳到下一个TAB位置)| |\ \\|代表一个反斜线字符'\'| |\0|空字符(NUL)| |\v|垂直制表(VT)| - 原始字符串:在字符串有一些\,但是不希望进行转义可以使用原始字符串。 - 字符串前面加r或者R实现。print(r"pyt\nhon") 6. 字符串的运算 - +∶拼接两个字符串,a="hello";b="world"=>a+b='helloworld'。 - \* : 字符串乘以一个数字可以得到重复次数的新的字符串,"a"*2=>"aa"。 7. 索引与切片 - 获取字符串中的字符元素: - 因为字符串是个有序序列,所以我们在访问字符串中的某些元素时可以根据元素对应的下标(索引)来访问: str[n]。正向访问时下标从0开始,到字符串长度减1。逆向访问时从-1开始,每次递减1。 - Str = "python”=> Str[0] =>“p" 8. 切片 - 批量获取(切片): str[a:b:c],a是起始元素的位置,b是终止元素的位置,c是步长。 - abc同样可以为负值。 - 当a为0、b为n、c为1时,可以省略不写: str[:](#); str[::2] (每两个取一个)。 - 注意:切片时一定要根据起始和终止位置设置步长;切片和索引可以用在Python中所有的有序序列中。 9. 字符串的常用操作 |操作|解释|示例| |---|---|---| |分割|str.split(str1):以为str1为分隔符对字符串切割|'python'.split('h')输出['pyt' , 'on']| |替换|str.replace(str1,str2):将字符串中的str1替换为str2生成新的字符串|'python'.replace('py' ,'PY')输出'PYthon'| |小写|str.lower():将字符串中的大写字符转化为小写|"PYTHON".lower()输出'python'| |大写|str.upper():将字符串中小写字符转化为大写|'python'.upper()|'python'.upper()输出'PYTHON'| |拼接|str.join(iter):将所给参数中的每个元素以指定的字符连接生成一个新的字符串|"-".join("huawei")输出'h-u-a-w-e-i' |格式化输出|格式化操作符(百分号%)、字符串转换类型和格式化操作符辅助指令实现格式化输出|"My name is %s , age is%d'%('AI",63)输出:My name is Al, age is 63| 10. 字符串格式化输出 - 字符串格式转换类型表格式 |格式符|描述| |:--:|--| |%c|字符及其ASCII码| |%s|字符串| |%d|有符号整数(十进制)| |%u|无符号整数(十进制) |%o|无符号整数(八进制)| |%x|无符号整数(十六进制)| |%X|无符号整数(十六进制大写字符)| |%e|浮点数字(科学计数法)| |%E|浮点数字(科学计数法,用E代替e)| |%f|浮点数字(用小数点符号)| - 格式化操作辅助指令 符号|作用 :--:|-- *|定义宽度或者小数点精度 -|用作左对齐。 +|在正数前面显示加号(+)。 |在正数前面显示空格。 #|在八进制数前显示零(o),在十六进制前显示Ox或者0X(取决于用的是x还是X) 。 0|显示数字前面填充“O”而不是默认的空格。 (var)|映射变量(字典参数)。 m.n|m是显示的最小总宽度,n是小数点后的位数。 11. string模块 - 在Python中,字符串本身内置了很多的操作方法和属性,除此以外Python还提供了一个字符串操作模块string。 - 在Python3中string模快提供的方法,和字符串内置的方法相似度较高。 ##### 元组 1. Tuple(元组) - 元组是一个有序且不可变序列,其中的元素可以是任意对象。一元组可以使用索引和切片的方式取值。 - 元组中的数据一旦生成就无法更改。 2. 元组的创建 - 元组存储的数据更加安全。 - 元组由一个小括号包裹,元素用逗号隔开。声明一个元组有三种方式: - Tuple = tuple((obj1, obj2,..)) # 可以通过此方法将其他序列转为元组 - Tuple = (obj1, obj2,...) - Tuple = obj1,obj2,obj3 3. 单元素元组 - 如果在声明元组时元组只有一个元素,需要在元素后面加上逗号,告诉解释器这不是运算符号中的括号。 - 嵌套元组中也是如此。 4. 元组的运算 - +:拼接两个元组: ``` t = (1,2,3) t1 = ( 3,2,1) t+t1 (1,2,3,3,2,1) ``` - *:元组乘以一个数字可以得到重复次数的新的元组: ``` t =(1,2,3) t*2 (1,2,3,1,2,3) ``` ##### 列表 1. List(列表) - 列表是一个有序可变的序列,其中的元素可以是任意对象。一列表可以使用索引和切片的方式取值。 - 列表可以随意的修改、删除和增加元素。 - 相较于元组而言,列表的安全性差,但是灵活性高。一列表支持的运算符同元组一样。 2. 列表的创建方式 - 列表由一个中括号包裹住元素,元素用逗号隔开。创建列表的方式有: - List = list((obj1, obj2,…))#可以通过此方法将其他序列转为列表 - List = [obj1, obj2,...] - 列表推导式 3. 列表推导式 - 推导式是可以从一个数据序列构建另一个新的数据序列的结构体,可以快速生成序列。 - 列表推导式: ```python [i for i in range(5)] # [O,1,2,3,4] [i for i in range(5) if i%2] # [1,3] [(x,y) for x in range(5) if x%2==0 for y in range(5) if y%2==1] # [(O,1),(O,3),(2,1),(2,3),(4,1),(4,3)] ``` 4. 列表常用操作 操作|解释|示例 :--:|---|--- 增加|list.append(obj):将参数内的对象添加至列表的尾部|a=[1,2];a.append(3);a输出[1,2,3] 增加|list.insert(index, obj):将对象插入到列表的index位置|a=[1,2];a.insert(O,3);a输出[3,1,2] 增加|list.extend(iter):将可迭代对象的每个元素逐个插入列表的尾部|a=[1,2];a.extend([3,4]);a输出[1,2,3,4] 删除|list.pop([index]):删除下标为index的元素,并将其返回(不传参数,默认删除最后一位元素)|a=[1,2];b=a.pop(1);a,b输出[1],2 删除|list.remove(obj):删除列表中第一个出现的给定元素|a=[1,2];a.remove(2);a 输出[1] 查找|list.index(obj):返回给定元素第一次出现位置的下标|a=[1,2];a.index(2);a 输出1 排序|list.sort():对列表进行排序,默认是升序|a=[3.1,2];a.sort();a输出[1,2,3] 逆序|list.reverse(:将列表中的元素进行逆置(直接修改列表本身)|a=[3,1,2];a.reverse();a 输出[2,1,3] 数量统计|list.count(obj):返回给定元素出现的次数|a=[3,1,2,1];a.count(1)输出2 5. 列表与数组 - Python中的列表在外观上和数组是有些相似的,但是两者并不是一种结构: - Python的内置数据结构中并没有数组。需要借助于工具包numpy实现。 - 列表可以和数组相互转化,但是本质是不一样的。 ##### 字典 1. Dictionary(字典) - 字典的每个元素由两部分组成-键和值,所以字典的元素也被称为键值对。 - 其中键是不可变且唯一的。 - 如果字典有相同的键,则后面的键对应的值会将前面的值覆盖。 - 数据量大时,字典数据的访问速度比列表块。 - 字典是无序可变的序列。 2. 创建字典 - 字典由一对花括号包裹,元素由逗号隔开。常见的字典创建方式: - Dict = {key:value,} - Dict = dict(key=value,) - Dict = dict([(key,value),]) - 字典推导式 3. 字典常用操作 操作|解释|示例 :---:|---|--- 获取|dict.get(key,default=None):根据键获取值,键不存在时返回默认值|Dict={'a':1,'b':2}; Dict.get('a')输出1 获取|dict.items():返回一个包含所有(键,值)元组的列表|Dict={'a':1,'b':2}; Dict.items() 输出dict_items([('a',1),('b',2)]) 获取|dict.keys():返回一个所有键组成的列表|Dict={'a':1,'b':2}; Dict.keys() 输出dict_keys(['a', 'b']) 获取|dict.values():返回一个所有值组成的列表|Dict={'a':1,'b':2}; Dict.values() 输出dict_values([1,2]) 添加|dict[key] = value:增加键值对{key:value},若key已存在,则修改现有key的值|Dict={'a':1,'b':2}; Dict['a']=3; Dict输出{'a':3,'b':2} 更新|dict.update(dict1):使用dict1对字典进行更新|Dict={'a':1,'b':2};Dict2={'a:3,c':3}; Dict.update(Dict2); Dict输出{'a': 3,'b': 2,'c': 3} 删除|dict.pop(key):删除并返回key对应的值|Dict={'a':1,'b':2};a=Dict.pop('a') ; Dict,a输出({'b': 2},1) 删除|dict.popitem()∶随机删除并返回一个键值对|Dict={'a':1,'b':2];a=Dict.popitem(); Dict,a输出({'a': 1}, ('b',2)) 删除|dict.clear()∶清空字典|Dict={'a':1,'b':2}; Dict.clear(); Dict输出{} ##### 集合 1. Set(集合) - 集合中的元素是唯一的,重复的元素会被删除。 - 集合是由一个花括号包裹,内部元素以逗号隔开。声明一个集合的方式有: - Set = set() - Set = {obj1,obj2,..} 2. 集合的运算。逻辑运算: - 交集set1 & set2:两个集合中相同的元素。 - 对称差集set1 ^ set2:两个集合中不同的元素。 - 并集set1 | set 2:两个集合内总共的元素(重复的删除)。 - 差集set1 - set 2:集合一中包含而集合二中不包含的元素。 3. 集合常用操作 操作|解释|示例 ---|---|--- 添加|set.add(obj):添加元素,如果元素已存在,则不会进行任何操作||Set={1,2,3};Set.add(4); Set输出{1,2,3,4} 添加|set.update(obj):添加对象可以是列表,字典等,且可以是多个,用逗号隔开|Set={1,2};Set.update({2,3});Set输出{1,2,3} 删除|set.remove(obj):移除元素(移除不存在元素是 会抛出异常)|Set={1,2};Set.remove(1);Set输出{2} 删除|set.discard(obj):删除元素(元素不存在时不会抛出异常)。|Set={1,2);Set.discard(1);Set输出{2} 删除|set.clear():清空集合。|Set={1,2);Set.clear();Set输出set() 删除|set.pop()︰随机删除一个元素|Set={1,2};a=Set.pop();Set,a输出({2}, 1) --- ### 3.2 Python中数据的常用操作 ##### 数据拷贝 1. 数据引用产生的问题 - 在Python中变量名是对于数据的引用。 - L2=L1,只是将L2指向了L1所指向的地址。 2. 数据拷贝 - 在Python中为了防止上述问题出现,可以使用拷贝的生成一份新的数据。 > 但 .copy()在拷贝嵌套列表时,还是会存在当修改一个时,另一个也会改变的问题 3. 深拷贝和浅拷贝 - 在Python中对于数据的拷贝可以根据拷贝形式的不同分为深拷贝和浅拷贝。 - 浅拷贝(copy()),即对数据的表面结构进行拷贝,如果数据为嵌套的结构,则嵌套结构里面的元素是对之前数据的引用。修改之前的数据会影响拷贝得到的数据。 - 深拷贝,解决了嵌套结构中深层结构只是引用的问题,它会对所有的数据进行一次复制,修改之前的数据则不会改变拷贝得到的数据 - 实现深拷贝:导入Python中的copy模块,使用模块中的deepcopy()方法。 ##### 运算符 1. 运算符 - Python运算符大致可分为7种,即算术运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、成员运算符以及身份运算符。 2. 比较运算符 - Python 也提供了6种比较运算符:>(大于), (小于),==(等于), ! =(不等于),>=(大于等于) ,=(小于等于)。比较运算的结果是一个布尔值,True或者False: 3. 赋值运算符 - Python形成了丰富的赋值运算符: =、+=、-=、/=、%=、*=、 > python 没有自增,自减运算符 4. 逻辑运算符 - Python 中3种逻辑运算符分别为: and (与), or(或) , not(非),逻辑运算的结果是布尔值,True或者False : - A and B:当A为False时,运算结果为False,否则返回B的值。 - A or B:当A为True时,运算结果为A的值,否则返回B的值。 - not A:当A为True时,返回False,否则返回True。 5. 位运算符 - Python中有6种位运算符: - (&)︰按位与运算符,参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0; - (|)︰按位或运算符,只要对应的二个二进位有一个为1时,结果位就为1; - (^ ):按位异或运算符,当两对应的二进位相异时,结果为1; - (~)︰按位取反运算符,对数据的每个二进制位取反,即把1变为0,把O变为1; - (>>)︰右移动运算符,把>>左边的运算数的各二进位全部右移若干位,>>右边的数指定移动的位数; - () ︰左移动运算符,运算数的各二进位全部左移若干位,由右边的数指定移动的位数,高位丢弃,低位补0。 6. 成员运算符 - 除了上文介绍的5种运算符,Python还支持成员运算符。Python中有如下数据结构:字符串、列表、元组、字典。字符串、列表、字典,它们就像一个集合,其中包含若干元素,这些元素就是集合的成员,对于一个给定的元素,它有可能在一个给定的集合中,也可能不在,Python中采用成员运算符来判断元素是否属于成员,成员运算的结果为布尔值,True或者False。 > not in 不在 7. 身份运算符 - 身份运算符用于比较两个标识符所引用对象的存储单元,计算结果为布尔值,包含两个运算符:is和is not,分别用于判断两个标识符是否引用自一个对象。 - is 与==区别: - is 用于判断两个变量引用对象是否为同一个,==用于判断引用变量的值是否相等。 --- ### 3.3数据结构基础 1. 数据结构 - 数据结构是软件开发中最基础的部分,也是较为重要的部分,常见的数据结构有 - 线性表 - 数组 - 链表 - 队列 - 树 - 图 - 堆、栈 - 散列表 2. 顺序存储结构 - 特点:用物理相邻的位置关系表示其逻辑关系 3. 链式存储结构 - 链式存储结构中,每一数据元素均使用一个结点来存储,并且每个结点的存储空间是单独分配的,因此存储这些结点的空间不一定是连续的。 - 在链式存储结构中,我们不仅需要存储数据元素本身,还需要存储数据元素之间的逻辑关系,即将结点分为两部分,一部分是存储数据元素本身的,我们称其为数据域;另一部分是存储下一个结点的地址(即存储逻辑关系)的,我们称其为指针域。通过将每一个结点的指针域链接起来,从而形成链式存储结构。 4. 树形结构 - 树形结构是是一个或多个节点的有限集合,也是一种非线性结构。 5. 图结构 - 图(Graph)结构是一种非线性的数据结构,图在实际生活中有很多例子,比如交通运输网,地铁网络,社交网络,计算机中的状态执行(自动机)等等都可以抽象成图结构。图结构H树结椒有杂的非线性结构。 - 顶点(vertex):一图中的数据元素。 - 边(edge): - 图中连接这些顶点的线。 --- --- ### 4.1判断语句 1. 如果...就... - 如果某些条件满足,才能做某件事情;条件不满足时,则不能做,这就是所谓的判断。 2. 程序中的如果...就... - 在Python中实现如果,使用的是关键字if。 - Python中的条件控制是通过条件语句的执行结果(True或者False)来决定执行的代码块。 3. Python中的对与错 - False: - o - None - []、()、{} - "" - True: - 除False以外的任意对象 3. elif - Python中使用if来控制程序的执行,如果有多个条件分支的判断,可以使用if -elif -else的形式。 ```python if 判断条件1: 执行语句1 elif 判断条件2: 执行语句2 else: 执行语句3 ``` 4. 判断语句的小技巧 - 使用隐式的判断条件。 - 将最可能出现的判断放在前面。 - 避免深层次的判断嵌套。 - 避免无意义的判断。 --- ### 4.2循环语句 1. 复读机 - 对于需要重复执行的任务,判断语句不适合使用,取而代之的是循环语句。 - 循环语句可以根据设置的循环次数,来执行相同的代码块。 - 设置循环次数同样需要判断条件。 - Python中的循环语句分为for循环和while循环。 2. 循环语句– for - Python中的for语句与其他语言中的for语句不太一样,它接受可迭代对象(例如序列)作为其参数,每次迭代其中的一个元素。。-- 可以在for循环后面加入else语句块,在循环结束时执行。 - for语句的用法: ``` for iter in iters: 循环语句块 else: 语句块 ``` 3. 循环语句- while - Python语言中while语句用于执行循环程序,在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。 - 可以在while后面加入else语句块,在条件为假时执行。 - while语句的用法: ``` while条件语句: 循环执行的语句块 #条件为真时执行 else: 语句块。 #条件为假时执行 ``` 4. continue - 在Python中使用continue实现本次循环的跳过。 - continue语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下—轮循环。 - continue语句可用在while和for循环中。 5. break - Python中使用break来结束整个循环。 - break语句结束整个循环。如果触发了break,则当前循环终止(循环对应的else也不会执行) 6. 嵌套循环 > break 和 continue 在嵌套循环中的作用位置 7. 死循环与空循环 - 空循环,即在循环任务中循环体是空的,不执行任何任务。 - 会导致系统CPU占用了高; - 浪费计算资源; 8. 递归 - 递归,程序调用自身的编程技巧称为递归,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决 ---
发布时间 2021/07/12 16:29:03 最后回复 wuyicom 2021/08/31 17:23:21 版块 社区活动
6083 70 0
他的回复:
华为云ID:ypmily+第1周笔记 --- ### 1.1 Python的前世今生 1. 历程 1. 1989年,Guido开始创造Python 2. 1991年,第一个正式版的Python解释踞诞生。由C语言实现。 3. 2000年,Python2.x版本发布 4. 2008年,Python3.x发布 5. 2020年,Python2.x停止维护 2. Py2和Py3 - Python2和Python3是Python的两个大版本。 - 两个版本在运算、语法和编码上有很多区别; - 两个版本互不兼容; - 具体区别 |区别项|Python2|Python3 |---|---|---| |编码|ASCIl码,不能识别中文|Unicode,可识别中文| |print|关键字,可以不加括号|函数,必须加括号| |函数|xrange、raw_input|range,input| |类|经典类和新式类混合|默认新式类| |运算符|5/2=2|5/2=2.5| --- ### 1.2 Python的优缺点 1. Python的优势–简单且优雅 - Python的语法简单,代码书写起来像是在写英文。 - Python中使用了缩进而不是各种花括号来区分代码块,看起来十分整洁。 2. Python的优势–工具库 - Python中有非常强大且数量众多的工具包 - 标准库:解释器内建的工具包。 - 第三方工具库:额外安装的工具包。 - Python中的第三方工具库有数十万个。 - 可以在[https://pypi.org/](#)中查看。 3. Python是一门开源的高级的面向对象的编程语言。 4. Python是动态解释性语言。 5. Python语言的扩展性强,可以调用其他语言所写的代码,也被称为胶水语言。 6. 支持函数式编程。 7. 速度慢:由于Python是解释型语言,所以它的速度会比C、C++慢一些。 - 解决方式:在需要高效率实现的功能处嵌套C++代码。 - 解决方式:更换解释器。 8. 伪多线程:Python中的多线程是一个“假”的多线程。 - 适合于IO密集型任务。 --- ### 1.3 Python能做什么 1. 人工智能 2. 数据分析 3. 搭建网站 4. 网络爬虫 5. 应用开发 6. 自动化运维 7. 软件测试 8. ...... --- --- ### 2.1 Python的生活环境 ##### Python的生活环境 1. Python环境 - Python脚本的执行依赖于Python的解释器,常用的Python解释器可以分为两种: - Python解释器 - Anaconda - Python环境可多版本共存。 - 在一台电脑上可以同时安装多个版本的Python (可同时安装py2和py3)。 2. Python解释器 - 纯净的Python环境,体积小。 - 需要额外的安装工具库(第三方工具)。 - Python官网可下载: [https://www.python.org](#) 3. Anaconda - Anaconda,是一种Python集成环境。 - Anaconda中内置了Python解释器; - Anaconda中本安装了一些常用的工具库(pandas、numpy等);- Anaconda中提供了一些代码开发工具,如jupyter; - Anaconda本身体积较大。 4. 虚拟环境 - 在Python项目开发时,可能面临多个项目共同开发,且每个项目的工具包版本不同,此时需要多套环境。 - 安装多个Python(不推荐) - 虚拟环境 - 虚拟环境即在当前Python环境创建一个新的环境(延用当前解释器,也可以自己指定),实现工具包的隔离。在实际开发过程中可以为每一个项目创建一个虚拟环境使用。 5. 安装虚拟环境 - Python解释器:安装工具包virtualenv实现。 - 使用命令virtualenv env创建环境。 - 可以额外安装Virtualenvwrapper工具包进行虚拟环境管理,使用后命令会发生变化。 - Anaconda:通过Anaconda提供工具可视化的创建虚拟环境。 --- ### 2.2玩"“蛇"的工具 1. 集成开发环境 - 集成开发环境((IDE)是一种辅助程序开发人员开发软件的应用软件,在开发工具内部就可以辅助编写源代码文本、并编译打包成为可用的程序,有些甚至可以设计图形接口。IDE通常包括编程语言编辑器、自动构建工具、通常还包括调试器。(维基百科) - 好的IDE是程序员开发的利器,可以加速应用开发的效率。 2. Python的IDE - DoS、IDLEE - txt - Pycharm - Jupyter notebook/lab - vscode - eclipse 3. 不同IDE下的编码工作(1) - DOS下编写Python代码没有办法保存,且没有辅助工具,不是很好的选择。 - 使用txt文本编辑工具编写Python代码,需要将文件更改后缀后py,在命令行中使用Python xx.py运行 4. 不同IDE下的编码工作(2) - Jupyter notebook,是一种web形式的交互式开发工具支持40多种语言。能够将代码、图表、文字显示在一个窗口,适合于学习、数据分析等场景使用。 - jupyter lab是notebook的加强版。 5. 不同IDE下的编码工作(3) - Pycharm:一款强大的Python集成开发工具,支持很多功能。 - 队协同开发 - Git插件 - 代码自动补全、高亮显示 - 单元测试、debug - Pycharm适用于大型项目和协同开发。 6. 不同IDE下的编码工作(4) - Visual Studio Code (vscode)是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全、代码重构、查看定义功能,并且内置了命令行工具和Git版本控制系统。可用于Python、C、html等多种语言的开发。 --- ### 2.3 Python中的“法律” ##### 语法和编码规范 1. 引入工具 - 在Python脚本文件中引入工具包使用使用到的语句有: - import package //导入package中的所有 - from xx import package //导入package中的 xx - import package as pk //导入package,然后重命名 2. 标识符 - 标识符:用来标识某个实体的一个符号,用于给变量、函数、语句块、对象等命名。 - Python标识符的命名规则: - 由字母、下划线和数字组成; - 不能以数字开头; - 不能和关键字重名。 3. 关键字 - Python中已经定义好的,一些具有特殊功能的标识符 - Python中的关键字获取方式: - import keyword keyword.kwlist 4. 变量 - Python中的变量是对数据存储地址的引用: - 数据在计算机上进行存储,会得到一个相应的存储地址。 - 给变量赋值,并不是将数据赋予变量,而是将变量指向了数据所在的存储地址。 5. 程序员的命名法则。 - 见名知意。 - 匈牙利(Hungarian)命名法: - 开头字母用变量类型的缩写,其余部分用变量的英文或英文的缩写,要求单词第一个字母大写。 - 驼峰(camel)命名法: - 混合使用大小写字母来构成变量和函数的名字。 - 第一个单词以小写字母开始;第二个单词的首字母大写(myName)。 - 每一个单字的首字母都采用大写字母( FirstName) 。 6. 程序与变量 - Python的程序自上而下的执行,使用变量时需要先定义再使用: - 变量的使用范围: - 局部变量:定义在函数内的变量,作用范围只能是函数内部范围内。 - 全局变量:定义在函数和对象外部,作用范围是整个模块内。 7. 程序员的内涵–注释 - 注释:对代码的解释和说明,其目的是让人们能够更加轻松地了解代码。在执行过程中,注释会被忽略。 - Python中的注释: - 单行注释符#: A= 10 # 这是一个数值型变量 - 多行注释使用doc string('''...''', """...""")。 8. “道德”规范 - PEP8规范是Python编码时所使用的规范 - PEP8是Python代码在书写时遵守的规范,并不是语法规则。遵守它可以提高代码可读性和美观性。 - 常用的PEP8规范有: - 和语法相关的每一层缩进都用4个空格来表示 - 函数和类的定义,代码前后都要用两个空行进行分隔。 - 二元运算符的左右两侧应该保留一个空格,而且只要一个空格就好。 - 变量、函数和属性应该使用小写字母来拼写,如果有多个单词就使用下划线进行连接。 - 模块级别的常量,应该采用全大写字母,如果有多个单词就用下划线进行连接。 ##### 基础函数 1. 基础函数-输出与输入 - print,用于输出。 - 打印传递的值。 - 可以通过end指定结尾符号(默认换行)。 ```python print("python") print("python", end="--") print("python") 输出: python python--python ``` - input,用于接收用户输入。 - 接收键盘输入。 - 接收的数据统一为字符串(py3) 。 ``` str_ = input("输入你的姓名:") print(str_) ``` 2. 查看帮助信息 - help,查看对象的帮助信息。 3. 查看对象的属性和方法 - dir,返回对象的属性和方法列表。 4. 获取对象的内存地址和类型。 - id,查看对象内存地址。 - type,用于查看对象类型。 - type还可以作为元类使用。 ---