Skip to content

Commit f7ebd34

Browse files
committed
更新md
更新md
1 parent cdcfd5f commit f7ebd34

5 files changed

Lines changed: 132 additions & 0 deletions

File tree

leetcode/array/两数之和.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
## 两数之和
2+
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
3+
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
4+
示例:
5+
```python
6+
给定 nums = [2, 7, 11, 15], target = 9
7+
因为 nums[0] + nums[1] = 2 + 7 = 9
8+
所以返回 [0, 1]
9+
10+
nums = [3,3],target=6
11+
[0,1]
12+
```
13+
#### 方法一:
14+
暴力法,时间复杂度O(n²),空间复杂度O(1)
15+
```python
16+
def twoSum(nums, target):
17+
for i in range(len(nums)):
18+
other_num = target - nums[i]
19+
if other_num in nums and nums.index(other_num) != i:
20+
return [i, nums.index(other_num)]
21+
```
22+
#### 方法二:
23+
空间换时间,用字典。时间复杂度O(n),空间复杂度O(n),所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素。
24+
25+
* 从前向后依次遍历数组中的元素。
26+
* 计算差值,如果差值不存在字典中,则保存当前遍历的元素到字典中。
27+
* 如果差值存在字典中,返回差值的索引与当前元素的索引。
28+
29+
```python
30+
def twoSum(nums, target):
31+
nums_dict = {}
32+
for index, num in enumerate(nums):
33+
other_num = target - num
34+
if other_num in nums_dict:
35+
return [nums_dict[other_num], index]
36+
nums_dict[num] = index
37+
```

leetcode/main.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
## LeetCode刷题
2+
1. [数组](数组.md)

leetcode/数组.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
## 数组
2+
1. [两数之和](array/两数之和.md)

python_advance/main.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
3. [位置参数、默认参数、可变参数、关键字参数](位置参数默认参数可变参数关键字参数.md)
55
4. [模块和包](模块和包.md)
66
5. [通用日志模块](通用日志模块.md)
7+
6. [变量的作用域与闭包](变量的作用域与闭包.md)
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
## 变量的作用域
2+
**对于不可变变量b,在函数f1()中先赋值后引用,此时的变量b只是函数中定义的局部变量,与全局变量b没有任何关系。**
3+
4+
```python
5+
b = 6
6+
def f1():
7+
# b只是f1()中的局部变量,与全局变量的b没有任何关系
8+
b = 1
9+
print(b) # 1
10+
if __name__ == '__main__':
11+
f1()
12+
print(b) # 6
13+
```
14+
15+
**在函数f1()中并没有声明变量b,直接引用的话,会在上层作用域搜索到全局变量b.**
16+
17+
```python
18+
b = 6
19+
def f1():
20+
# 直接引用变量b,在局部变量中并没有找到b的声明,就会去上一层找到全局变量b
21+
print(b) # 6
22+
if __name__ == '__main__':
23+
f1()
24+
print(b) # 6
25+
```
26+
27+
**在函数f1()中,先引用变量b,然后在对变量b进行赋值操作,会编译报错。因为此时python认为变量b是f1()作用域内的局部变量,但是在f1()函数内并没有对变量b的声明。**
28+
29+
```python
30+
b = 6
31+
def f1():
32+
# 先引用,后赋值,编译不通过
33+
# 此时认为b是f1()的局部变量,但是在引用的时候并没有在函数内找到该局部变量
34+
print(b) # 报错
35+
b = 2
36+
if __name__ == '__main__':
37+
f1()
38+
print(b)
39+
```
40+
41+
**通过global关键字声明变量b是全局的变量b,可以解决上面的问题。**
42+
43+
```python
44+
b = 6
45+
def f1():
46+
# 可以通过global关键字来声明这是全局变量b
47+
global b
48+
print(b) # 6
49+
b = 2
50+
if __name__ == '__main__':
51+
f1()
52+
print(b) # 2
53+
```
54+
55+
**嵌套函数中,内函数引用并修改外函数中的局部变量,需要nonlocal关键字来声明,这是一个自由变量。**
56+
57+
```python
58+
def f3():
59+
c = 2
60+
def f4():
61+
nonlocal c
62+
# 嵌套函数,内函数引用并修改外函数的不可变变量,要通过nonlocal关键字声明这是自由变量
63+
c += 2
64+
print(c)
65+
return f4
66+
if __name__ == '__main__':
67+
f4 = f3()
68+
f4() # 4
69+
```
70+
71+
**由上可见,函数中引用并修改作用域之外的不可变变量,如果是全局变量,可以通过global关键字先声明后使用,如果是非全局变量,可以通过nonlocal关键字声明使用。**
72+
## 闭包
73+
闭包:**引入了自由变量的函数就是闭包**。被引入的自由变量和函数一同存在,即使这个变量已经离开了创造它的环境也不例外。(或者理解:**嵌套函数中,内函数引用了外函数中的局部变量,并且外函数的返回值是内函数的引用,这样就形成了一个闭包**。)
74+
75+
**一般对函数的理解**:函数再被调用的时候,会在栈上创建其执行环境,初始化其中定义的变量和外部参数,以便函数执行下一步的操作。当函数执行完成后,返回函数结果,函数之前的栈内存便会被销毁,函数中的临时变量以及计算的中间结果都不会保存。每次调用执行函数,都会重新初始化函数的执行环境。
76+
77+
**闭包是另一种情况**:外部函数发现自己的临时变量会在将来的内部函数中使用到,外部函数在结束自己返回内函数引用的同时,会把外部函数的临时变量和内函数绑定在一起,所以,即使外部函数已经结束了,但是调用内部函数的时候,仍可以使用外部函数的临时变量,也就是自由变量。
78+
79+
```python
80+
def outer(a, b):
81+
def inner(x):
82+
return a*x + b
83+
return inner
84+
if __name__ == '__main__':
85+
inn = outer(2, 2)
86+
print(inn(1)) # 4
87+
print(inn(2)) # 6
88+
# 查看内函数的自由变量 ('a', 'b')
89+
print(inn.__code__.co_freevars)
90+
```

0 commit comments

Comments
 (0)