@@ -1358,11 +1358,57 @@ reduce(lambda x,y : x*y,range(1,n+1))
1358
1358
1359
1359
1360
1360
### 75.什么是lambda函数? 有什么好处?
1361
+
1362
+ lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的函数
1363
+
1364
+ 1.lambda函数比较轻便,即用即仍,很适合需要完成一项功能,但是此功能只在此一处使用,连名字都很随意的情况下
1365
+
1366
+ 2.匿名函数,一般用来给filter,map这样的函数式编程服务
1367
+
1368
+ 3.作为回调函数,传递给某些应用,比如消息处理
1369
+
1361
1370
### 76.递归函数停止的条件?
1371
+
1372
+ 递归的终止条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断的结果选择是继续调用自身,还是return,,返回终止递归。
1373
+
1374
+ 终止的条件:判断递归的次数是否达到某一限定值
1375
+
1376
+ 2.判断运算的结果是否达到某个范围等,根据设计的目的来选择
1377
+
1362
1378
### 77.下面这段代码的输出结果将是什么?请解释。
1363
- ### 78.什么是lambda函数?它有什么好处?写一个匿名函数求两个数的和
1379
+
1380
+ ``` python
1381
+ def multipliers ():
1382
+ return [lambda x : i * x for i in range (4 )]
1383
+ print ([m(2 ) for m in multipliers()])
1384
+
1385
+ ```
1386
+
1387
+ 上面代码的输出结果是[ 6,6,6,6] ,不是我们想的[ 0,2,4,6]
1388
+
1389
+ 你如何修改上面的multipliers的定义产生想要的结果?
1390
+
1391
+ 上述问题产生的原因是python闭包的延迟绑定。这意味着内部函数被调用时,参数的值在闭包内进行查找。因此,当任何由multipliers()返回的函数被调用时,i的值将在附近的范围进行查找。那时,不管返回的函数是否被调用,for循环已经完成,i被赋予了最终的值3.
1392
+
1393
+ ``` python
1394
+ def multipliers ():
1395
+ for i in range (4 ):
1396
+ yield lambda x : i * x
1397
+ ```
1398
+
1399
+ ``` python
1400
+ def multipliers ():
1401
+ return [lambda x ,i = i: i* x for i in range (4 )]
1402
+
1403
+ ```
1404
+
1405
+
1406
+
1364
1407
1365
1408
1409
+ ### 78.什么是lambda函数?它有什么好处?写一个匿名函数求两个数的和
1410
+
1411
+ lambda函数是匿名函数,使用lambda函数能创建小型匿名函数,这种函数得名于省略了用def声明函数的标准步骤
1366
1412
1367
1413
1368
1414
## 设计模式
@@ -1439,10 +1485,64 @@ print ([[x for x in range(1,100)] [i:i+3] for i in range(0,100,3)])
1439
1485
yield就是保存当前程序执行状态。你用for循环的时候,每次取一个元素的时候就会计算一次。用yield的函数叫generator,和iterator一样,它的好处是不用一次计算所有元素,而是用一次算一次,可以节省很多空间,generator每次计算需要上一次计算结果,所以用yield,否则一return,上次计算结果就没了
1440
1486
## 面向对象
1441
1487
### 90.Python中的可变对象和不可变对象?
1488
+
1489
+ 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
1490
+
1491
+ 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上其所指的值直接发生改变,并没有发生复制行为,也没有开辟出新的地址,通俗点说就是原地改变。
1492
+
1493
+ Pyhton中,数值类型(int 和float),字符串str、元祖tuple都是不可变类型。而列表list、字典dict、集合set是可变类型
1494
+
1442
1495
### 91.Python的魔法方法
1496
+
1497
+ 魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被Python所调用,你可以定义自己想要的行为,而这一切都是自动发生的,它们经常是两个下划线包围来命名的(比如` __init___ ` ,` __len__ ` ),Python的魔法方法是非常强大的所以了解其使用方法也变得尤为重要!
1498
+
1499
+ ` __init__ ` 构造器,当一个实例被创建的时候初始化的方法,但是它并不是实例化调用的第一个方法。
1500
+
1501
+ ` __new__ ` 才是实例化对象调用的第一个方法,它只取下cls参数,并把其他参数传给` __init___ ` .
1502
+
1503
+ ` ___new__ ` 很少使用,但是也有它适合的场景,尤其是当类继承自一个像元祖或者字符串这样不经常改变的类型的时候。
1504
+
1505
+ ` __call__ ` 让一个类的实例像函数一样被调用
1506
+
1507
+ ` __getitem__ ` 定义获取容器中指定元素的行为,相当于self[ key]
1508
+
1509
+ ` __getattr__ ` 定义当用户试图访问一个不存在属性的时候的行为。
1510
+
1511
+ ` __setattr__ ` 定义当一个属性被设置的时候的行为
1512
+
1513
+ ` __getattribute___ ` 定义当一个属性被访问的时候的行为
1514
+
1443
1515
### 92.面向对象中怎么实现只读属性?
1516
+
1517
+ 将对象私有化,通过共有方法提供一个读取数据的接口
1518
+
1519
+ ``` python
1520
+ class person :
1521
+ def __init__ (self , x ):
1522
+ self .__age = 10
1523
+ def age (self ):
1524
+ return self .__age
1525
+ t = person(22 )
1526
+ # t.__age =100
1527
+ print (t.age())
1528
+ ```
1529
+
1530
+ 最好的方法
1531
+
1532
+ ``` python
1533
+ class MyCls (object ):
1534
+ __weight = 50
1535
+
1536
+ @ property
1537
+ def weight (self ):
1538
+ return self .__weight
1539
+
1540
+ ```
1541
+
1444
1542
### 93.谈谈你对面向对象的理解?
1445
1543
1544
+ 面向对象是相当于面向过程而言的,面向过程语言是一种基于功能分析的,以算法为中心的程序设计方法,而面向对象是一种基于结构分析的,以数据为中心的程序设计思想。在面向对象语言中有一个很重要的东西,叫做类。面向对象有三大特性:封装、继承、多态。
1545
+
1446
1546
## 正则表达式
1447
1547
### 94.请写出一段代码用正则匹配出ip?
1448
1548
### 95.a = “abbbccc”,用正则匹配为abccc,不管有多少b,就出现一次?
0 commit comments