Python学习总结(二)

一、可变类型与不可变类型

1.前提

首先需要记住的一点是,在python中,变量的赋值是使用引用来传递的。这也就意味着,不管这个对象是已经存在的还是新创建的,在赋值的时候都将传递这个对象的引用

学过C++不难发现,所谓引用,其实就是给被引用的变量取了一个别名。
引用一段话 原文链接:https://blog.csdn.net/shen_chengfeng/article/details/80687396

python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象;可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。


2.两种数据类型

不可变数据类型

  • 数字类型:intboolfloatcomplexlong(2.x)
  • 字符串:str
  • 元组:tuple

可变数据类型

  • 列表list
  • 字典dict


3.一个例子

a = 1
print(id(1))  # 1
print(id(a))  # 2 same to 1

a = 2
print(id(a))  # 3 diff from 1

b = 1
print(id(b))  # 4 same to 1

c = a
print(id(c))  # 5 same to 3

二、函数的一些细节

函数的返回值

若无指定返回值,则函数默认返回值类型为NoneType

num = 5
# 函数的定义部分需要与上面语句间隔两行


def func():
    # TODO(cui) 此语句可用于解释将要做什么
    """函数体的整体注释"""
    tmp_1 = 10
    tmp_2 = 12

    print(id(tmp_1), id(tmp_2))
    # global 声明变量后,可以修改全局变量,否则python在函数中修改全局变量无效
    # 如果不使用global修饰的话,默认在本地创建一个与全局变量同名的新变量
    # return (tmp_1, tmp_2)
    return tmp_1, tmp_2  # 这样默认返回的是元组的形式
    # return [tmp_1, tmp_2]


# result = func()  # 使用 列表/元组 接收
tmp1, tmp2 = func()  # 接收的变量个数应与返回参数的个数一致,否则报错
print(tmp1, tmp2)
print(id(tmp1), id(tmp2))  # id()可以用于取变量的地址

传递可变类型与不可变类型参数

可变类型变量作为参数传递时,在函数体内部改变该参数值不会对形参造成影响
不可变类型变量作为参数传递时,~~会造成改变


函数的缺省参数

类比于C++中的缺省参数,缺省参数可有可无。

python中缺省参数的注意事项:
  • 在函数定义中,缺省参数应该从右向左
  • 在调用具有多个缺省参数的函数时,如果想要给某个具体的缺省参数传递数据,需要指定缺省值名
  • 书写规范:缺省参数的赋值号左右无间隔

多值参数

有时可能可能需要一个函数能够处理的参数个数是不确定的,这个时候,就可以使用多值参数

  • python中有两种多值参数:(1)参数名前加一个*可以接收元组(2)参数名前增加**可以接收字典。
  • 一般给多值参数命名时,习惯使用以下两个名字(1)**args:存放元组参数(2)**kwargs:存放字典的参数

例如程序:

def func(num, *args, **kwargs):
    print(num)
    print(args)
    print(kwargs)


func(0, 1, 2, 3, 4, name="xiaoming", age=18)  # 不使用拆包

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

拆包语法

使用情况:调用函数时,将一个元组变量或一个字典变量直接传递给相应的形参
使用方法:

  • 在实参的元组变量前加*
  • 在字典变量前加**

代码:

def func(num, *args, **kwargs):
    print(num)
    print(args)
    print(kwargs)

    
tp = (1, 2, 3, 4)
dc = {"name": "xiaoming", "age": 18}
func(0, *tp, **dc)  # 拆包

递归

算法方面,不再赘述。

猜你喜欢

转载自blog.csdn.net/cprimesplus/article/details/87876018
今日推荐