Python干货——函数(2)

126 阅读8分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的8天,点击查看活动详情

👨‍🎓作者:Java学术趴

🏦仓库:GithubGitee

✏️博客:CSDN掘金InfoQ云+社区

💌公众号:Java学术趴

🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。

🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。

☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!

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

9.4 函数的返回值

  • 函数执行完之后会返回一个对象,如果函数中存在return就返回实际的值,否则就返回None
  • 返回值的类型可以是任意类型:返回值类型取决于return返回的类型
  • 一个函数中可以存在多个return,但是只会返回一个return后面的值
  • 如果执行了 return 语句,那么就代表这个函数已经结束了

# 函数的返回值# 使用 return 返回函数的计算结果
def add(a, b):
    return a + b
​
print(add(1, 2))

9.5 函数的嵌套使用

  • 在一个函数中可以调用另一个函数。和Java的使用方式一样

# 函数的嵌套调用# 使用 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

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


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的)


# 只获取一个字典的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中的使用方式是一样的。函数中优先使用局部变量,满足就近原则。

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

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

在函数中修改全局变量


# 如果使用全局变量的时候直接拿来使用即可。不需要使用 global 关键字声明
# 只有在修改变量值的时候需要使用 global 关键字声明
  • Java中修改全局变量的值

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中修改一个局部变量
  • 错误

# 全局变量和局部变量
# 定义一个全局变量
name: str = '张三'
# 定义一个函数修这个全局变量
def modify():
    """
    在一个函数中修改全局变量
    此时这种形式不能修改,这种形式县相当于在函数中创建了一个name的局部变量
    :return:
    """
    name = '李四'
    print(name)
    pass
modify()
# 李四print(name)
# 张三。Python中修改全局变量和Java是不一样的
# Java中直接获取就可以修改,而Python不可以
  • 正确

# 全局变量和局部变量
# 定义一个全局变量
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 关键字针对的是不可变的类型修改变量的值。比如:数字、字符串、元组等

  • 可变类型:

    1. 直接改变其中的数据的时候需要使用 global 关键字

alobal char
char = [1, 2, 3, 4]
   	2. **使用类型中的方法修改数据直接修改即可。不需要 global 关键字**

char.append(5)

测试代码:


# 全局变量和局部变量
# 定义一个全局变量的list列表
char: list = []
​
# 定义一个函数修这个全局变量
def modify():
    """
    当在函数中修改一个可变类型的数据的时候如果直接赋值需要使用 global 关键字
    :return:
    """
    # 全局的变量名可以大写,函数中的变量名字、形参、函数名一般小写
    # 直接赋值需要关键字
    global char
    char = [1, 2, 3, 4]
    return char
    passdef 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的结果就是表达式计算之后的结果

语法格式:

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

举例:


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

换成普通函数的样子


# 此时的test叫做函数名
def test(x,y):
    reuturn x+y

9.5.2 lambda与三元运算符

语法格式:


if a:
    b
else:
    c

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


b if a else c 

'可以参军' if age > 18 else '继续上学'

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


greater = (lambda x, y: x if x > y else y)
print(greater(3, 5))
# 5
greater(6, 2)
# 6

# 匿名函数可以参军
var = (lambda age: '可以参军' if age > 18 else '不可以参军')
​
# 调用匿名函数
print(var(20))
# 可以参军

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


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

一个参数使用 lambda 表达式


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

使用 lambda的缺点:

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

9.6 递归函数

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

使用递归函数的要求:

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