Java中的方法
1. 方法概述
1.1 方法的概念
方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集
- 注意:
- 方法必须先创建才可以使用,该过程成为方法定义
- 方法创建后并不是直接可以运行的,需要手动使用后,才执行,该过程成为方法调用
2. 方法的定义和调用
2.1 无参数方法定义和调用
-
定义格式:
public static void 方法名 ( ) { // 方法体; }
-
调用格式:
方法名();
-
注意:
方法必须先定义,后调用,否则程序将报错
3. 带参数方法的定义和调用
3.1 带参数方法定义和调用
-
定义格式:
参数:由数据类型和变量名组成 - 数据类型 变量名
参数范例:int a
public static void 方法名 (参数1) { 方法体; } public static void 方法名 (参数1, 参数2, 参数3...) { 方法体; }
-
注意:
方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错
方法定义时,多个参数之间使用逗号( ,)分隔
-
-
调用格式:
方法名(参数); 方法名(参数1,参数2);
- 方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错
3.2 形参和实参
- 形参:方法定义中的参数
等同于变量定义格式,例如:int number
- 实参:方法调用中的参数
等同于使用变量或常量,例如: 10 number
4. 带返回值方法的定义和调用
4.1 带返回值方法定义和调用
-
定义格式
public static 数据类型 方法名 ( 参数 ) { return 数据 ; }
- 注意:
- 方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
- return语句, 只能带回一个结果
- 注意:
-
调用格式
方法名 ( 参数 ) ; 数据类型 变量名 = 方法名 ( 参数 ) ;
- 注意:
- 方法的返回值通常会使用变量接收,否则该返回值将无意义
- 注意:
5. 方法的注意事项
5.1 方法的通用格式(重要)
-
格式:
public static 返回值类型 方法名(参数) { 方法体; return 数据 ; }
-
解释:
-
public static 修饰符,目前先记住这个格式
返回值类型 方法操作完毕之后返回的数据的数据类型
如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
方法名 调用方法时候使用的标识
参数 由数据类型和变量名组成,多个参数之间用逗号隔开
方法体 完成功能的代码块
return 如果方法操作完毕,有数据返回,用于把数据返回给调用者
-
-
定义方法时,要做到两个明确
- 明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型
- 明确参数:主要是明确参数的类型和数量
-
调用方法时的注意:
- void类型的方法,直接调用即可
- 非void类型的方法,推荐用变量接收调用
6. 方法重载
6.1 方法重载
-
方法重载概念
方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
- 多个方法在同一个类中
- 多个方法具有相同的方法名
- 多个方法的参数不相同,类型不同或者数量不同
-
注意:
- 重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
- 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载
7. 方法的参数传递
Java中方法的参数传递:基本类型传递的只是值,引用类型传递的是内存地址
7.1 方法参数传递基本类型
-
测试代码:
package com.itheima.param; public class Test1 { /* 方法参数传递为基本数据类型 : 传入方法中的, 是具体的数值. */ public static void main(String[] args) { int number = 100; System.out.println("调用change方法前:" + number); change(number); System.out.println("调用change方法后:" + number); } public static void change(int number) { number = 200; } }
-
结论:
- ==基本数据类型的参数,形式参数的改变,不影响实际参数 ==
-
结论依据:
- 每个方法在栈内存中,都会有独立的栈空间,方法运行结束后就会弹栈消失
7.2 方法参数传递引用类型
-
测试代码:
package com.itheima.param; public class Test2 { /* 方法参数传递为引用数据类型 : 传入方法中的, 是内存地址. */ public static void main(String[] args) { int[] arr = {10, 20, 30}; System.out.println("调用change方法前:" + arr[1]); change(arr); System.out.println("调用change方法后:" + arr[1]); } public static void change(int[] arr) { arr[1] = 200; } }
-
结论:
- ==对于引用类型的参数,形式参数的改变,影响实际参数的值 ==
-
结论依据:
- 引用数据类型的传参,传入的是地址值,内存中会造成两个引用指向同一个内存的效果,所以即使方法弹栈,堆内存中的数据也已经是改变后的结果
Python中的函数
函数(一)总结
-
函数的作用:封装代码,高效的代码重用
-
函数使用步骤
- 定义函数
def 函数名(): 代码1 代码2 ...
- 调用函数
函数名()
-
函数的参数:函数调用的时候可以传入真实数据,增大函数的使用的灵活性
- 形参:函数定义时书写的参数(非真实数据)
- 实参:函数调用时书写的参数(真实数据)
-
函数的返回值
- 作用:函数调用后,返回需要的计算结果
- 写法
return 表达式
-
函数的说明文档
- 作用:保存函数解释说明的信息
- 写法
def 函数名(): """ 函数说明文档 """
-
使用 help(函数名)
-
函数嵌套调用:一个函数内部嵌套调用另外一个函数
函数(二)总结
- 变量作用域
- 全局:函数体内外都能生效
- 局部:当前函数体内部生效(函数内部使用全部变量,需要使用
global
关键字声明)
- 函数多返回值写法
return 表达式1, 表达式2...
-
注意:
1.
return a, b
写法,返回多个数据的时候,默认是元组类型。
2. return后面可以连接列表、元组或字典,以返回多个值。 -
函数的参数
-
位置参数
- 形参和实参的个数和书写顺序必须一致
-
关键字参数
- 写法:
key=value
- 特点:形参和实参的书写顺序可以不一致;关键字参数必须书写在位置参数的后面
- 写法:
-
缺省参数
- 缺省参数就是默认参数
- 写法:
key=vlaue
- 缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。
def user_info(name, age, gender='男'):
print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('TOM', 20)
user_info('Rose', 18, '女')
-
注意:函数调用时,如果为缺省参数传值则修改默认参数值;否则使用这个默认值。
-
不定长位置参数
- 收集所有位置参数,返回一个元组
-
不定长关键字参数
- 收集所有关键字参数,返回一个字典
- 不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。
-
包裹位置传递
def user_info(*args):
print(args)
# ('TOM',)
user_info('TOM')
# ('TOM', 18)
user_info('TOM', 18)
注意:传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包裹位置传递。
- 包裹关键字传递
def user_info(**kwargs):
print(kwargs)
# {'name': 'TOM', 'age': 18, 'id': 110}
user_info(name='TOM', age=18, id=110)
综上:无论是包裹位置传递还是包裹关键字传递,都是一个组包的过程。
- 引用:Python中,数据的传递都是通过引用
- 在python中,值是靠引用来传递来的。
我们可以用id()
来判断两个变量是否为同一个值的引用。 我们可以将id值理解为那块内存的地址标识。
所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变.
- 可变与不可变类型
- 可变类型
- 列表
- 字典
- 集合
- 不可变类型
- 整型
- 浮点型
- 字符串
- 元组
函数(三)总结
-
递归
- 函数内部自己调用自己
- 必须有出口
1)递归的应用场景
递归是一种编程思想,应用场景:
- 在我们日常开发中,如果要遍历一个文件夹下面所有的文件,通常会使用递归来实现;
- 在后续的算法课程中,很多算法都离不开递归,例如:快速排序。
2)递归的特点
- 函数内部自己调用自己
- 必须有出口
3) 应用:3以内数字累加和
- 代码
# 3 + 2 + 1
def sum_numbers(num):
# 1.如果是1,直接返回1 -- 出口
if num == 1:
return 1
# 2.如果不是1,重复执行累加并返回结果
return num + sum_numbers(num-1)
sum_result = sum_numbers(3)
# 输出结果为6
print(sum_result)
-
lambda
- 语法
lambda 参数列表: 表达式
-
lambda的参数形式
- 无参数
lambda: 表达式
- 一个参数
lambda 参数: 表达式
- 默认参数
lambda key=value: 表达式
- 不定长位置参数
lambda *args: 表达式
- 不定长关键字参数
lambda **kwargs: 表达式
-
高阶函数
-
把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。
-
作用:把函数作为参数传入,化简代码
-
内置高阶函数
- map()
- reduce()
- filter()
-