愉快的开始第2天的学习啦~加油
昨天学到全局变量就结束了,今天继续谈一谈全局变量怎么改。。
1、如何修改全局变量
全局变量和局部变量的变量名字相同,但是查看全局变量的时候,会屏蔽函数内部的局部变量。
>>> count = 5
>>> def Count():
count = 10
print(count)
>>> Count()
10
>>> print(count)
5
使用global对count进行修改:
>>> count = 5
>>> def myfun():
count = 10
print(10)
>>> myfun()
10
>>> print(count)
5
>>> def myfun():
global count
count = 10
print(10)
>>> myfun()
10
>>> print(count)
10
2、内嵌函数(内部函数)
python支持函数内部嵌套函数,就是函数套函数。
3、闭包
闭包是由内部函数演变而来。
内嵌函数funy()相当于一个闭包,funx()定义的x相对funy()来讲就是全局变量,funy()是无法修改x的大小的,就是funx()和funy()的x不是一个东西,两码事。
>>> def funx():
x = 5
def funy():
x *= x
return x
return funy()
>>> funx()
Traceback (most recent call last):
File "<pyshell#21>", line 1, in <module>
funx()
File "<pyshell#20>", line 6, in funx
return funy()
File "<pyshell#20>", line 4, in funy
x *= x
UnboundLocalError: local variable 'x' referenced before assignment
想要这个x能够传进去进行运算,有两种办法:
(1)使用访问列表的办法:
>>> def funx():
x = [5]
def funy():
x[0] *= x[0]
return x
return funy()
>>> funx()
[25]
>>>
>>> def funx():
x = [5]
def funy():
x[0] *= x[0]
return x[0]
return funy()
>>> funx()
25
(2)使用nonlocal,强制申明它不是全局变量。
>>> def funx():
x = 5
def funy():
nonlocal x
x *= x
return x
return funy()
>>> funx()
25
4、表达式lambda
>>> def func(a,b):
x = a + b
return x
>>> func(1,3)
4
>>> g = lambda a,b : a + b
>>> g(1,2)
3
5、内置函数:
(1)filter()过滤器:吧0和非ture的东西过滤
常规用法:
>>> filter(None,[1,0,False,True])
<filter object at 0x000001C5E5B80E10>
>>> list(filter(None,[1,0,False,True]))
[1, True]
可以用它筛选需要的数据,比如只要奇数:
错误1:没有规定x范围;
错误2:lambda不可以写等式。
>>> list(filter(lambda x : x %2 = 0))
SyntaxError: lambda cannot contain assignment
>>> list(filter(lambda x : x %2 = 0,range(10)))
SyntaxError: lambda cannot contain assignment
>>> list(filter(lambda x : x %2 ,range(10)))
[1, 3, 5, 7, 9]
(2)map():映射
将每个元素进行迭代加工,然后返回每个元素加工后的结果。
>>> list(map(lambda x : x - 1,range(10)))
[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8]
6、递归:python默认100层
(1)无递归:求阶乘
错误版本1:结果不对
>>> def jiec(n):
for a in range(1,n):
a *= a
return a
>>> jiec(6)
25
错误版本2:不会写循环条件
>>> def jiec(a):
for a = a - 1:
a = a * (a-1)
if a = 0:
return a:
SyntaxError: invalid syntax
错误版本3:判断语句不对
>>> def jiec(n):
for a in range(1,n):
a = a * (a-1)
if a = 0:
return a
SyntaxError: invalid syntax
正确版本:
>>> def jiec(n):
b = n
for a in range(1,n):
b *= a
return b
>>> jiec(3)
6
>>> jiec(6)
720
(2)递归版本
>>> def degui(n):
if n == 1:
return 1
else:
return n * degui(n - 1)
>>> degui(5)
120
7、斐波那契数列实现:
我寄几创造的递归(都是错,哎):
错误1:def函数申明!!!!!!!!!!!!!不是del
del tuzi(n):
for n in range(1,n):
if n == 1:
return 1
else if n == 2:
return 1
else:
return tuzi(n-2) + tuzi(n-1)
sum = tuzi(20)
print("一共有" + sum + "只兔子")
错误2:都递归了,怎么还写了for循环?
def tuzi(n):
for n in range(1,n):
if n == 1:
return 1
else if n == 2:
return 1
else:
return tuzi(n-2) + tuzi(n-1)
sum = tuzi(20)
print("一共有" + sum + "只兔子")
错误3:拼接错误,int和str没办法在一起
def tuzi(n):
if n == 1 or n == 2:
return 1
else:
return tuzi(n-2) + tuzi(n-1)
sum = tuzi(20)
print("一共有"+sum+"只兔子" )
终于改对的版本(艰难):
def tuzi(n):
if n == 1 or n == 2:
return 1
else:
return tuzi(n-2) + tuzi(n-1)
sum = tuzi(20)
print("一共有%d只兔子" %sum)
老师的例子:
def fab(n):
if n < 1:
print("输入错误")
return -1
if n == 1 or n == 2:
return 1
else:
return fab(n-1) + fab(n-2)
result = fab(20)
print("共 有%d对兔子诞生" % result)
if result == -1:
print("共 有%d对兔子诞生" % result)
8、汉诺塔
def hanoi(n,x,y,z):
if n == 1:
print(x,"--->",z)
else:
hanoi(n-1,x,z,y)#吧n-1个盘从x移动到y借用z
print(x,'-->',z)#吧第n个(最底下的大盘子)盘子移动到z
hanoi(n-1,y,x,z)#吧第n-1个盘子从y移动到z上,借用x
n = int(input("请输入层数:"))
hanoi(n,'X','Y','Z')
9、字典(哈希值)
序列:列表(中括号)、元组(括号)
映射:字典(大括号)
(1)创建和访问:{键:键值,…}
>>> dic1 = {'我':'是女孩','你':'是男孩','ta':'不知是男是女'}
>>> print('我',dic1['我'])
我 是女孩
>>> print('我的样子',dic1['我'])
我的样子 是女孩
用关键字创建(我,在创建的时候不可以加引号,结果会自动加上):
>>> dic4 = dict(我 = '小狗',你 = '小猫')
>>> dic4
{'我': '小狗', '你': '小猫'}
(2)dict():只有一个映射类型的参数
>>> dict3 = dict((('n',10),('a',12),('e',13)))
>>> dict3
{'n': 10, 'a': 12, 'e': 13}
(3)更改和查询:当查询内容存在于字典中,则会修改键值。如果不存在,则会将不存在的内容添加进去。
>>> dic4['我'] = '小米'
>>> dic4
{'我': '小米', '你': '小猫'}
>>> dic4['小明'] = 'oppo'
>>> dic4
{'我': '小米', '你': '小猫', '小明': 'oppo'}
(4)创建字典:fromkeys()函数
>>> dict1 = {}
>>> dict1.fromkeys((1,2,3))
{1: None, 2: None, 3: None}
>>> dict1.fromkeys((1,2,3),'number') #批量给每一个键进行赋值
{1: 'number', 2: 'number', 3: 'number'}
>>> dict1.fromkeys((1,3),'是你') #不会对原来的内容进行修改,而是重新创建
{1: '是你', 3: '是你'}
(5)访问字典的几种方法
keys()函数
values()函数
items()函数:每一项按照元组的形式打印出来
>>> dic4
{'我': '小米', '你': '小猫', '小明': 'oppo'}
>>> for eachkey in dic4.keys():
print(eachkey)
我
你
小明
>>> for eachValue in dic4.values():
print(eachValue)
小米
小猫
oppo
>>> for eachItem in dic4.items():
print(eachItem)
('我', '小米')
('你', '小猫')
('小明', 'oppo')
get()函数:获取指定键后面的键值;当没有这个键的时候,回车后什么都没有,除非你在后面写上一个标志(比如none),就是啥也没有会返回none,如果有就返回对应的键值了。
>>> dic4
{'我': '小米', '你': '小猫', '小明': 'oppo'}
>>> dic4.get('她')
>>> dic4.get('她','none')
'none'
>>> dic4.get('我','none')
'小米'
除此之外也可以直接查这个键存在否:存在:ture,不存在:false。
>>> '我' in dic4
True
>>> '她' in dic4
False
(6)清空一个字典:clear()
>>> dic4
{'我': '小米', '你': '小猫', '小明': 'oppo'}
>>> dic4.clear()
>>> dic4
{}
字典是不会被覆盖的,只能用clear()清空,否则容易发生数据窃取。
a吧值赋值给b,改变a的值,b并不会改变。
>>> a = {'我是':'小米'}
>>> a
{'我是': '小米'}
>>> b = a
>>> a = {}
>>> b
{'我是': '小米'}
>>> a.clear()
>>> a
{}
>>> b
{'我是': '小米'}
吧b的值赋值给a,只有把a清空了,b才能被清空
>>> a = b
>>> a
{'我是': '小米'}
>>> b
{'我是': '小米'}
>>> a.clear()
>>> a
{}
>>> b
{}
>>>
(7)copy()函数
拷贝和赋值后,地址是不同的;
只有赋值,地址相同。
>>> a.fromkeys((1,2,3),'nihao')
{1: 'nihao', 2: 'nihao', 3: 'nihao'}
>>> b = a
>>> c = a.copy()
>>> id(a)
2694333858152
>>> id(b)
2694333858152
>>> id(c)
2694333857864
10、pop():给定键,直接弹出来键值,该操作相当于删除这一项。
popitem():随机弹,弹出来就删了。
setdefault(3,‘three’)和get()操作一样,添加一组键和键值。
>>> a = {1 : 'one',2:'two'}
>>> a.pop(1)
'one'
>>> a.popitem()
(2, 'two')
>>> a.setdefault(3,'three')
'three'
>>> a
{3: 'three'}
11、update():将b字典直接更新加入a中
>>> a
{3: 'three'}
>>> b = {'小白':'狗'}
>>> a.update(b)
>>> a
{3: 'three', '小白': '狗'}
12、集合:当你用花括号整了一堆数字,但是每个数字后没冒号体现映射,那么这一堆数字就是集合。
(1)唯一性,不会存在重复的元素!
(2)不支持索引
>>> num = {1,2,3,4}
>>> type(num)
<class 'set'>
(3)set()工厂函数:去除重复的元素
方法1 :
>>> num1 = [1,1,2,2,3,3,4]
>>> temp = []
>>> for each in num1:
if each not in temp:
temp.append(each)
>>> temp
[1, 2, 3, 4]
方法2 :(注意:set()函数不会排序,只会随机出现排除完重复元素的结果)
>>> num1 = [1,1,2,2,3,3,4]
>>> num1 = list(set(num1))
>>> num1
[1, 2, 3, 4]
(4)可以使用in查看元素是否在集合中()
>>> num1
[1, 2, 3, 4]
>>> 1 in num1
True
>>> '2' in num1
False
(5)不可变集合:frozenset()
>>> num2 = frozenset([1,2,3,4])
>>> num2
frozenset({1, 2, 3, 4})
>>> num2.add(0)
Traceback (most recent call last):
File "<pyshell#113>", line 1, in <module>
num2.add(0)
AttributeError: 'frozenset' object has no attribute 'add'
13、文件操作
(1)打开文件
open()函数出入模板如下代码块,模式如下,文件对象方法如下:
>>> help(open)
Help on built-in function open in module io:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
>>> f = open('D:\\untitled\\practise.txt')
>>> f
<_io.TextIOWrapper name='D:\\untitled\\practise.txt' mode='r' encoding='cp936'>
>>> f.read()
'你好'
>>> f.read(2)
''
>>> f.tell() #返回当前书签 的指针位置
4
>>>
>>> f.seek(1,0)
1
>>> f.readline()
'勉好\n'
(2)文件写入
>>> f = open('F:\\nihao.txt','w')
>>> f.write('nihaoa ')
7
>>> f.close()
14、模块
(1)OS模块:不需要担心你是什么操作系统,OS会帮你直接选择正确的模块使用。
>>> import os #导入模块
>>> os.getcwd() #查看当前操作的目录
'D:\\untitled'
>>> os.listdir() #查看当前目录内容
['.idea', '029文件:一个任务(课件+源代码).zip', 'boy_1.txt', 'boy_2.txt', 'boy_3.txt', 'fishC', 'game1.py', 'girl_1.txt', 'girl_2.txt', 'girl_3.txt', 'hanoi.py', 'hello.py', 'practise.txt', 'shengtuzi.py', 'test3.py', 'venv']
>>> os.chdir('E\\') #改当前操作目录,必须是一个字符串而且是一个路径
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
os.chdir('E\\')
FileNotFoundError: [WinError 2] 系统找不到指定的文件。: 'E\\'
>>> os.chdir('E:\\')
>>> os.getcwd()
'E:\\'
>>> os.chdir('D:\\untitled')
>>> os.getcwd()
'D:\\untitled'
>>> os.mkdir('D:\\untitled\\A')#创建文件夹
>>> os.mkdir('D:\\untitled\\A\\b')#创建主文件A后,才可以创建子文件夹b
>>> os.remove('D:\\untitled\\A\\b')#不可以删除文件夹,只能删除文件
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
os.remove('D:\\untitled\\A\\b')
PermissionError: [WinError 5] 拒绝访问。: 'D:\\untitled\\A\\b'
>>> os.remove('D:\\untitled\\A\\b\\test.txt')
>>>> os.removedirs('D:\\untitled\\A\\b')#删除当前文件夹下面的空文件夹
(2)os.path
>>> os.path.basename('D:\\untitled\\A\\test.txt') #去掉目录返回文件名字
'test.txt'
>>> os.path.dirname('D:\\untitled\\A\\test.txt') #去掉文件名字返回目录
'D:\\untitled\\A'
>>> os.path.join('C:','A','b') #括号里面的,逗号之间的,组合起来,形成路径
'C:A\\b'
>>> os.path.join('C','A','b') #括号里面的,逗号之间的(但是如果加了除了逗号以外的,比如冒号),要想组合起来,形成路径就得自己打斜杠
'C\\A\\b'
>>> os.path.join('C:\\','A','b')
'C:\\A\\b'
>>> os.path.split('D:\\untitled\\A\\test.txt')
('D:\\untitled\\A', 'test.txt')
>>> os.path.split('D:\\untitled\\A')
('D:\\untitled', 'A') #split()不太能分清楚文件和文件夹,默认到最后一个那里切分