零、数据类型:
因为java数据类型和python有较大命名上的区别,导致现在再学习python时很容易混淆:
通过百度百科先了解一下这集合术语的权威解释:
数组:是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。(强调相同类型,无序)
集合: 集合是指具有某种特定性质的具体的或抽象的对象汇总而成的集体(其互异性保证集合中不能有形相同数据)
列表:列表是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合(强调有序,一种集合)
元组(tuple):是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。 (python中和列表意义相同只不过不能修改)
现在完美解释 :1、java和python出现概念不同的原因是一个是强类型一个是弱类型语言。
2、列表也是一种集合,但是有点特殊,因为列表有序所以可以有重复值,python语言数据类型严格按照数学概念定义,所以java的list集合不是严格意义上的集合,而是列表
3、java有基本数据类型和引用类型之分,python全是引用类型,有可修改和不可修改之分
https://blog.csdn.net/yz930618/article/details/77170340
一、局部变量:
小结:
1、就是在函数内部定义的变量
2、作用范围就是在这个函数内部,函数之外不能使用
3、作用是存储临时保存的数据
二、全局变量
1、如果一个变量既能在一个函数中使用也能在别的函数使用这个变量就是全局变量
(在函数外边定义的变量叫做 全局变量)
举例:
定义全局变量
a = 100
def test1():
a = 666
print(a) # 虽然没有定义变量a但是依然可以获取其数据
def test2():
print(a) # 虽然没有定义变量a但是依然可以获取其数据
调用函数
test1()
test2()
运行结果:
666
100
发现:
当函数内出现局部变量和全局变量相同名字时,函数内部中的 变量名 = 数据 此时理解为定
义了一个局部变量,而不是修改全局变量的值,那么问题来了怎么在函数中修改成员变量的值呢?在函数中加 global
举例:
定义全局变量
a = 100
def test1():
global a
a = 666
print(a) # 虽然没有定义变量a但是依然可以获取其数据
def test2():
print(a) # 虽然没有定义变量a但是依然可以获取其数据
调用函数
test1()
test2()
运行结果:
666
666
发现:
如果在函数中出现 global 全局变量的名字 那么这个函数中即使出现和全局变量名相同的 变量
名 = 数据 也理解为对全局变量进行修改,而不是定义局部变量
三、如果函数中如何有多个return值?
在python中我们怎样返回多个值?
def create_nums():
print("—1---")
return 1 # 函数中下面的代码不会被执行,因为return除了能够将数据返回之外,还有一个隐藏的
功能:结束函数
print("—2---")
return 2
print("—3---")
总结1:
一个函数中可以有多个return语句,但是只要有一个return语句被执行到,那么这个函数就会
结束了,因此后面的return没有什么用处
如果程序设计为如下,是可以的因为不同的场景下执行不同的return
1、if else
2、 return(a,b)
…
四、注意事项:
1、缺省参数
在形参中默认有值的参数,称之为缺省参数
注意:带有默认值的参数一定要位于参数列表的最后面
def printinfo(name, age=35, sex):
… print name
…
File “”, line 1
SyntaxError: non-default argument follows default argument
. 缺省参数在*args后面
def sum_nums_3(a, *args, b=22, c=33, kwargs):
print(a)
print(b)
print©
print(args)
print(kwargs)
sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)
说明:
如果很多个值都是不定长参数,那么这种情况下,可以将缺省参数放到 *args的后面, 但如果有kwargs的话,**kwargs必须是最后的
2、对返回数据直接拆包:
拆包、交换变量的值
<1> 对返回的数据直接拆包
def get_my_info():
high = 178
weight = 100
age = 18
return high, weight, age
result = get_my_info()
print(result)
my_high, my_weight, my_age = get_my_info()
print(my_high)
print(my_weight)
print(my_age)
总结:
拆包时要注意,需要拆的数据的个数要与变量的个数相同,否则程序会异常
除了对元组拆包之外,还可以对列表、字典等拆包
要理解dict的有关内容需要你理解哈希表(map)的相关基础知识,这个其实是《算法与数据结构》里面的内容。
1.list和tuple其实是用链表顺序存储的,也就是前一个元素中存储了下一个元素的位置,这样只要找到第一个元素的位置就可以顺藤摸瓜找到所有元素的位置,所以list的名字其实就是个指针,指向list的第一个元素的位置。list的插入和删除等可以直接用链表的方式进行,比如我要在第1个元素和第2个元素中间插入一个元素,那么直接在链表的最后面(我们假设这个list只有两个元素,那么也就是在第3个元素的位置上)插入这个元素,然后把第一个元素指针指向这个元素(第3个位置),然后再把新插入的元素的指针指向原来的第2个元素,这样插入操作就完成了。读取这个list的时候,先用list的名字(就是个指针,指向第1个元素的位置)找到第一个元素,然后用第1一个元素的指针找到第2个元素(位置3),然后用第2个元素的指针找到第3个元素(位置2),以此类推。所以list的顺序和内存中的实际顺序其实不一定完全对应。这种存储方式不会浪费内存,但查找起来特别费时间,因为要按照链表一个一个找下去,如果你的list特别大的话,那么要等好久才会找到结果。
2.dict则为了快速查找使用了一种特别的方法,哈希表。哈希表采用哈希函数从key计算得到一个数字(哈希函数有个特点:对于不同的key,有很大的概率得到的哈希值也不同),然后直接把value存储到这个数字所对应的地址上,比如key=‘ABC’,value=10,经过哈希函数得到key对应的哈希值为123,那么就申请一个有1000个地址(从0到999)的内存,然后把10存放在地址为123的地方。类似的,对于key=‘BCD’,value=20,得到key的哈希值为234,那么就把20存放在地址为234的地方。对于这样的表查找起来是非常方便的。只要给出key,计算得到哈希值,然后直接到对应的地址去找value就可以了。无论有几个元素,都可以直接找到value,无需遍历整个表。不过虽然dict查找速度快,但内存浪费严重,你看我们只存储了两个元素,都要申请一个长度为1000的内存。
3.现在你知道为啥key要用不可变对象了吧?因为不可变对象是常量,每次的哈希值算出来都是固定的,这样就不会出错。比如key=‘ABC’,value=10,存储地址为123,假设我突发奇想,把key改成’BCD’,那么当查找’BCD’的value的时候就会去234的地址找,但那里啥也没有,这就乱套了。
3.你看我们上面有一句话:对于不同的key,有很大的概率得到的哈希值也不同。那么有很小的概率不同的key可以得到相同的哈希值了?没错,比如对于我们的例子来说,哈希值只有3位,那么只要元素个数超过1000,就一定会有至少两个key的哈希值相同(鸽笼原理),这种情况叫“冲突”,设计哈希表的时候要采取办法减少冲突,实在冲突了也要想办法补救。不过这是编译器的事情,况且对于初学者的我们来说碰到的冲突的概率基本等于零,就不用操心了。