Python快速入门(七)语法进阶:引用、局部&全局变量、函数返回多个值、缺省参数、多值参数、递归函数


前言:主要介绍Pythong的引用、局部变量、全局变量、函数return多个值、修改函数的参数、函数的缺省参数、函数的多值参数、元组和字典的拆包、递归函数等。


1.引用(指针)

  1. 定义一个数字变量,然后查看它的指针(注意:数据的地址本质上就是一个数字)。

代码:

a = 10
print("a = %d 变量保存数据的内存地址是 %d" % (a,id(a)))

输出:
在这里插入图片描述

  1. 函数的引用:调用 test 函数,本质上传递的是实参保存数据的引用,而不是实参保存的数据(注意:如果函数有返回值,没有定义变量接收,程序不会报错,但是无法获得返回结果)。

代码:

def test(num):
    print("在函数内部num = %d 对应的内存地址是 %d" % (num, id(num)))
    result = "hello"
    print("函数要返回数据的内存地址是 %d" % id(result))
    return result

a = 10
print("a = %d 变量保存数据的内存地址是 %d" % (a,id(a)))
r = test(a)
print("%s 的内存地址是 %d" % (r, id(r)))

输出:
在这里插入图片描述

2.局部变量

只能再函数的局部中使用,函数执行,则变量才会被创建,函数结束则变量结束(注意:在函数内部声明的变量,在其他函数中则不能被使用)
代码:

def demo1():
    a = 100
    print("demo1中的a = %d" % a)

def demo2():
    a = 1
    print("demo2中的a = %d" % a)
    pass

demo1()
demo2()

注意:pass是空语句,是为了保持程序结构的完整性,不做任何事情,一般用做占位语句。
输出:
在这里插入图片描述

3.全局变量

在全局声明的变量,可以在各个函数中进行使用。
代码:

a = 520

def demo1():
    print("demo1中的a = %d" % a)

def demo2():
    print("demo2中的a = %d" % a)

demo1()
demo2()

输出:
在这里插入图片描述

4.修改全局变量

1)直接修改全局变量

代码:

a = 520
print("a = %d 变量保存数据的内存地址是 %d" % (a,id(a)))

def demo1():
    # 希望修改全局变量的值
    # 在 python 中,是不允许直接修改全局变量的值
    # 如果使用赋值语句,会在函数内部,定义一个局部变量
    a = 52
    print("demo1中a = %d 变量保存数据的内存地址是 %d" % (a, id(a)))

def demo2():
    print("demo2中a = %d 变量保存数据的内存地址是 %d" % (a, id(a)))

demo1()
demo2()

输出:
在这里插入图片描述
观察a = 520和demo2中的a = 520变量中保存的内存地址是一样的,demo1中的a=52是不一样的。在 python 中,是不允许直接修改全局变量的值。(有兴趣的童鞋可以对比一下Java中的全局变量)

2)使用 global修改全局变量

修改全局变量的值,使用 global 声明一下变量即可,global 关键字会告诉解释器后面的变量是一个全局变量,再使用赋值语句时,就不会创建局部变量。
代码:

a = 10
print("a = %d 变量保存数据的内存地址是 %d" % (a,id(a)))

def demo1():
    global a
    a = 99
    print("在demo1中使用global修改a = %d 变量保存数据的内存地址是 %d" % (a, id(a)))

def demo2():
    print("在demo2中a = %d 变量保存数据的内存地址是 %d" % (a, id(a)))

demo1()
demo2()
print("最后执行的a = %d 变量保存数据的内存地址是 %d" % (a,id(a)))

输出:
在这里插入图片描述

5.全局变量位置&命名规范

  • 注意1:我么在使用全局变量的时候,应该把所有全局变量,定义在所有函数上方,就可以保证所有的函数,都能够正常的访问到每一个全局变量了,以免出错。
  • 注意2:在定义全局变量的时候,可以以gl_开头。

代码:

gl_num = 520
gl_name = "fly"

def demo():
    num = 99
    print("%d" % num)
    print("%s" % gl_name)

demo()

6.函数return多个值

在Java中只能返回一个数据类型,在Python中我们可以利用元组进行返回多个值。
代码:

def info():
    name = "fly"
    age = 20
    return name, age

# 元组
result = info()
print(result)

print(result[0])
print(result[1])

# 注意:使用多个变量接收结果时,变量的个数应该和元组中元素的个数保持一致
gl_name, gl_age = info()

print(gl_name)
print(gl_age)

输出:
在这里插入图片描述

7.交换数字a和b

在其他编程语言中我们交换数字a和b的时候,常常借助中间值,或者进行简单的运算才行。
比如:

# 交换a和b:-使用其他变量
c = a
a = b
b = c

# 交换a和b:-不使用其他的变量
a = a + b
b = a - b
a = a - b

但是在Python中我们可以利用元组的方法进行交换。
代码:

a = 200
b = 100
a, b = (b, a)
print(a)
print(b)

i = 10
j = 20
# 提示:等号右边是一个元组,只是把小括号省略了
i, j = j, i
print(i)
print(j)

输出:
在这里插入图片描述

8.不可变和可变的参数

在函数内部,针对参数使用赋值语句,不会修改到外部的实参变量。
代码:

def demo(a, a_list):

    print("函数内部的代码")
    print(a)
    print(a_list)
    a = 100
    a_list = [1, 2, 3]
    print("重新赋值的a",a)
    print("重新赋值的a_list",a_list)

gl_a = 99
gl_list = [4, 5, 6]
demo(gl_a, gl_list)
print(gl_a)
print(gl_list)

输出:
在这里插入图片描述

9.函数内部通过append方法修改可变参数

可以使用append方法,修改函数内部的可变参数。
代码:

def demo(num_list):

    print("函数内部的代码")
    num_list.append(100)
    print("修改后的num_list",num_list)

gl_list = [1, 2, 3]
print(gl_list)
demo(gl_list)
print(gl_list)

输出:
在这里插入图片描述

10.列表相加

  • 注意1:列表变量使用 + 不会做相加再赋值的操作,比如:num_list = num_list + num_list。
  • 注意2:num_list += num_list相等于num_list.extend(num_list),实质上是调用列表的 extend 方法

代码:

def demo(num, num_list):

    print("函数开始")
    # num = num + num
    # 列表变量使用 + 不会做相加再赋值的操作 !
    # num_list = num_list + num_list
    # print(num)
    # print(num_list)

    num += num
    # 本质上是在调用列表的 extend 方法
    # num_list.extend(num_list)
    num_list += num_list
    print(num)
    print(num_list)


gl_num = 100
gl_list = [1, 2, 3]
print(gl_num)
print(gl_list)
print("*"*100)
demo(gl_num, gl_list)
print("*"*100)
print(gl_num)
print(gl_list)

输出:
在这里插入图片描述

11.函数的缺省参数&自定义缺省参数

1.通过列表排序的代码看一下缺省参数使用:

gl_list01 = [11, 23, 9]
# 默认按照升序排序
gl_list01.sort()
print(gl_list01)

gl_list02 = [11, 23, 9]
# 如果需要降序排序,需要执行reverse参数
gl_list02.sort(reverse=True)
print(gl_list02)

输出:
在这里插入图片描述
2.自定义缺省参数(注意:在指定缺省参数的默认值时,应该使用最常见的值作为默认值):

def info(name, gender=True):

    gender_text = "男生"
    if not gender:
        gender_text = "女生"
    print("%s 是 %s" % (name, gender_text))

info("小明")
info("老王")
info("小美", False)

输出:
在这里插入图片描述
3.自定义缺省参数的注意点:

def print_info(name, title="", gender=True):

    gender_text = "男生"
    if not gender:
        gender_text = "女生"
    print("[%s]%s 是 %s" % (title, name, gender_text))


print_info("小明","班长")
print_info("老王","班主任")
print_info("小美", gender=False)

输出:
在这里插入图片描述

12.函数的多值参数

代码1:

def demo(num, *nums, **person):
    print(num)
    print(nums)
    print(person)

demo(1, 2, 3, 4, 5, name="fly", age=18)

输出:
在这里插入图片描述
代码2:

def sum_numbers(*args):
    num = 0
    print(args)
    # 循环遍历
    for n in args:
        num += n
    return num

result = sum_numbers(1, 2, 3, 4, 5)
print(result)

输出:
在这里插入图片描述

13.元组和字典的拆包

  • 注意1:元组的形式 (x,x,x,x)
  • 注意2:字典的形式{key: value, key, value}
    代码:
def demo(*args, **kwargs):
    print(args)
    print(kwargs)

# 元组变量/字典变量
gl_nums = (1, 2, 3)
gl_dict = {"name": "fly", "age": 18}

# 拆包语法,简化元组变量/字典变量的传递
demo(*gl_nums, **gl_dict)
demo(1, 2, 3, name="fly", age=18)

输出:
在这里插入图片描述

14.递归函数

1.特点:

def sum_number(num):
    print(num)
    # 递归的出口,当参数满足某个条件时,不再执行函数
    if num == 1:
        return 
    # 自己调用自己
    sum_number(num - 1)
sum_number(3)

输出:
在这里插入图片描述
2.求和:

def sum_numbers(num):
    if num == 1:
        return 1
    temp = sum_numbers(num - 1)
    # 两个数字的相加
    return num + temp

result = sum_numbers(100)
print(result)

输出:
在这里插入图片描述


结束!下一节开始面向对象!!!

发布了129 篇原创文章 · 获赞 83 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_32306361/article/details/105064507
今日推荐