前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python干货——函数(2)

Python干货——函数(2)

原创
作者头像
Java学术趴
发布2022-06-04 08:29:24
7730
发布2022-06-04 08:29:24
举报
文章被收录于专栏:Java全栈·Java全栈·

👨‍🎓作者:Java学术趴 🏦仓库:GithubGitee ✏️博客:CSDN掘金InfoQ云+社区 💌公众号:Java学术趴 🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。 🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。

👋大家好!我是你们的老朋友Java学术趴。任何的语言都离不开函数,都包括内置函数和自定义函数,函数的作用就是对功能进行封装以便于无效调用。

9.4 函数的返回值

  • 函数执行完之后会返回一个对象,如果函数中存在return就返回实际的值,否则就返回None
  • 返回值的类型可以是任意类型:返回值类型取决于return返回的类型
  • 一个函数中可以存在多个return,但是只会返回一个return后面的值
  • 如果执行了 return 语句,那么就代表这个函数已经结束了
代码语言:javascript
复制
# 函数的返回值
​
# 使用 return 返回函数的计算结果
def add(a, b):
    return a + b
​
print(add(1, 2))
复制代码

9.5 函数的嵌套使用

  • 在一个函数中可以调用另一个函数。和Java的使用方式一样
代码语言:javascript
复制
# 函数的嵌套调用
​
# 使用 return 返回函数的计算结果
def add(a, b):
    return a + b
​
def substruction(a, b):
    c: int = add(a, b)
    return c - b
​
# 函数的嵌套调用
result: int = substruction(1, 2)
print(result)
# 1
复制代码

列题:定义一个函数,将一个列表中奇数位的元素存储到一个新的列表中

代码语言:javascript
复制
def odd(char):
    # 定义一个列表存储奇数位的数据
    list_new: list = []
    # 定义一个变量来对应列表的下标值
    index: int = 0
    for data in char:
        if index % 2 == 1:
            list_new.append(data)
            # pass只是在书写代码跳出代码块的,并不会对代码的执行产生影响
            pass
        index += 1
        continue
        pass
    return list_new
​
print(odd(range(1, 11)))
复制代码

例题:将一个字典中的元素赋值到一个新的元素(对value的要求,长度必须是小于等于2的)

代码语言:javascript
复制
# 只获取一个字典的value的前两位,把这个前两位作为value值传递给一个新的字典
​
def obtain(**kwargs):
    # 定义一个新字典
    wordbook: dict = {}
    for key, value in kwargs.items():
        # 将旧字典的key以及value值赋值给新的字典
        if len(value) > 2:
            # 关键代码。因为向字典中添加一个新元素的时候,如果在key存在会替换value值
            # 如果key不存在会添加一个新的元素
            # 所提在这里使用这种方式相当于直接在字典中添加 key--value
            wordbook[key] = value[:2]
            pass
        else:
            wordbook[key] = value
            pass
        pass
    return wordbook
​
# 调用函数
dictionary: dict = {'name': '张三','hobby': ['游泳', '健身', '打豆豆'], 'room': 'Python1105班'}
print(obtain(**dictionary))
# {'name': '张三', 'hobby': ['游泳', '健身'], 'room': 'Py'}
​
复制代码

9.4 全局变量和局部变量

  • 他的原理和Java中的使用方式是一样的。函数中优先使用局部变量,满足就近原则。

局部变量: 就是在函数内部定义的变量

全局变量: 定义在函数的外边,可以全部的函数使用

在函数中修改全局变量

代码语言:javascript
复制
# 如果使用全局变量的时候直接拿来使用即可。不需要使用 global 关键字声明
# 只有在修改变量值的时候需要使用 global 关键字声明
复制代码
  • Java中修改全局变量的值
代码语言:javascript
复制
public class Test {
    private static String name = "张三";
    public static void main(String[] args) {
        add(); // 周六
    }
    // Java中在一个函数中可以直接修改全局变量
    public static void add(){
        name = "李四";
        System.out.println(name);
    }
}
复制代码
  • Python中修改一个局部变量
  • 错误
代码语言:javascript
复制
# 全局变量和局部变量
# 定义一个全局变量
name: str = '张三'
# 定义一个函数修这个全局变量
def modify():
    """
    在一个函数中修改全局变量
    此时这种形式不能修改,这种形式县相当于在函数中创建了一个name的局部变量
    :return:
    """
    name = '李四'
    print(name)
    pass
modify()
# 李四
​
print(name)
# 张三。Python中修改全局变量和Java是不一样的
# Java中直接获取就可以修改,而Python不可以
复制代码
  • 正确
代码语言:javascript
复制
# 全局变量和局部变量
# 定义一个全局变量
name: str = '张三'
# 定义一个函数修这个全局变量
def modify():
    """
    在一个函数中修改全局变量,必须在变量名的前面加上 global 关键字
    此时的 变量name就不是函数中从新声明的一个局部变量name
    而是全局变量中的name变量
    :return:
    """
    # 如果使用全局变量的时候直接拿来使用即可。不需要使用 global 关键字声明
    # 只有在修改变量值的时候需要使用 global 关键字声明
    print(name)
    global name
    name = '李四'
    print(name)
    pass
modify()
# 李四 (函数中的name代表全局变量中的name)
​
print(name)
# 李四 (全局变量的name)
复制代码
  • 不可变类型:使用 global 关键字针对的是不可变的类型修改变量的值。比如:数字、字符串、元组等
  • 可变类型:直接改变其中的数据的时候需要使用 global 关键字
代码语言:javascript
复制
alobal char
char = [1, 2, 3, 4]
复制代码
代码语言:javascript
复制
   	2. **使用类型中的方法修改数据直接修改即可。不需要 global 关键字**
复制代码
代码语言:javascript
复制
char.append(5)
复制代码

测试代码:

代码语言:javascript
复制
# 全局变量和局部变量
# 定义一个全局变量的list列表
char: list = []
​
# 定义一个函数修这个全局变量
def modify():
    """
    当在函数中修改一个可变类型的数据的时候如果直接赋值需要使用 global 关键字
    :return:
    """
    # 全局的变量名可以大写,函数中的变量名字、形参、函数名一般小写
    # 直接赋值需要关键字
    global char
    char = [1, 2, 3, 4]
    return char
    pass
​
def modify2():
    """
    如果使用列表对应的方法可以进行直接的添加数据和修改数据,不需要 global 关键字
    :return:
    """
    char.append(5)
    return char
    pass
​
# 直接修改需要关键字 global
print(modify())
# [1, 2, 3, 4]
​
print(char)
# [1, 2, 3, 4]
​
# 使用列表中的方法修改不需要关键字
print(modify2())
# [1, 2, 3, 4, 5]
​
print(char)
# [1, 2, 3, 4, 5]
​
复制代码

9.5 匿名函数

9.5.1 匿名函数的基本语法

在Python 中使用lambda关键字创建匿名函数,所谓匿名函数即这个函数没有名字,不用def关键字创建标准的函数。

匿名函数特点:

  • 使用lambda关键字去创建函数
  • 函数没有名字
  • 匿名函数冒号后面的表达式有且只有一个。注意:是表达式,而不是语句
  • 匿名函数自带 return,而这个return的结果就是表达式计算之后的结果

语法格式:

代码语言:javascript
复制
lambda 参数1,参数2,参数3:执行代码语句(这个代码语句必须是表达式)
复制代码

举例:

代码语言:javascript
复制
# 这个test并不是函数名,而是变量名,相当于把这个匿名函数赋值给了一个变量
# 当在调用这个函数的时候使用这个变量名调用
test = lambda x,y:x+y
print(test(1,3))
# 4
print(test(4,5))
# 9
复制代码

换成普通函数的样子

代码语言:javascript
复制
# 此时的test叫做函数名
def test(x,y):
    reuturn x+y
复制代码
9.5.2 lambda与三元运算符

语法格式:

代码语言:javascript
复制
if a:
    b
else:
    c
复制代码

能够由以下等效的表达式模拟:

代码语言:javascript
复制
b if a else c 
复制代码
代码语言:javascript
复制
'可以参军' if age > 18 else '继续上学'
复制代码

这样的表达式(二元运算)能够在lombda中,他们能够在lambda函数中实现选择逻辑:

代码语言:javascript
复制
greater = (lambda x, y: x if x > y else y)
print(greater(3, 5))
# 5
greater(6, 2)
# 6
复制代码
代码语言:javascript
复制
# 匿名函数可以参军
var = (lambda age: '可以参军' if age > 18 else '不可以参军')
​
# 调用匿名函数
print(var(20))
# 可以参军
复制代码

lambda表达式可以在声明的时候直接赋值,可以进行直接调用

代码语言:javascript
复制
# 在定义lambda表达式的时候直接调用
rs = (lambda x, y: x if x > y else y)(3, 4)
print(rs)
# 4
复制代码

一个参数使用 lambda 表达式

代码语言:javascript
复制
# 一个参数使用 lambda 表达式
parameter = lambda x: x*800+1
# 返回值是一个 int 类型,不能直接与字符串拼接,需要格式化操作
print('结果是:{}'.format(parameter(1)))
# 结果是:801
print('结果是:%d' % parameter(1))
# 结果是:801
复制代码

使用 lambda的缺点:

  • lambda只能写一个表达式,只能在简单的逻辑中进行使用。复杂的逻辑还是需要使用 def 进行定义函数

9.6 递归函数

递归函数:如果一个函数的内部不调用其他函数,而是自己本身的话,这个函数就是递归函数。

使用递归函数的要求:

  • 递归函数必须有一个结束条件,否则递归无法结束会一直递归下去,当到达最大递归的时候会报错
  • 递归函数的内部自己调用自己,不调用其他的函数

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 9.4 函数的返回值
  • 9.5 函数的嵌套使用
  • 9.4 全局变量和局部变量
  • 9.5 匿名函数
    • 9.5.1 匿名函数的基本语法
      • 9.5.2 lambda与三元运算符
      • 9.6 递归函数
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档