如何学pyhton深度学习 之 “我的python学习进阶之路” 2

愉快的开始第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()不太能分清楚文件和文件夹,默认到最后一个那里切分
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值