咸糖记录编程的地方

念念不忘,必有回响。

目录
记一次电话面试
/  

记一次电话面试

首先是自我介绍 我就将了自己学习python的经历 8个月这样
爬虫相关倒是一点没问

#1.java
java 问了8种最基础的数据类型 没有答出来
面向对象的三中基本特征也问了
也答出来一些
#2.python
什么是python python的弊端 我就只讲了动态类型 和调试不方便这两个方面
看的出面试官有些失望
python 的重载机制
python 首先直接问了垃圾回收机制 判断水平
根本没有了解
format的用法 split的用法
python的变量的作用域答出来一点
python 传入参数的几种方法

还问了 python 单引号 双引号 三引号的区别 答出来一半 还有一个是什么情况下必须使用双引号 和使用双引号的场景

#3.数据库

数据库问了 左联结和右连接 我很糊涂 然后就没有答出来

还有问了compute by 和order by 的作用 我答出来了
然后是order by 和compute by 的使用顺序 当然知道啦

最后那个老哥说二轮通知你
肯定是凉凉了啊
不过还是学会了很多
知道了很多不足

向老师请教后推荐了一本书叫 《程序员面试宝典》 之后去看一下

————————————18.43——————————

趁热打铁

java 的8种数据类型

byte,short,int,long,float,double,boolean,char

面向对象的三大基本特征 没有仔细了解的部分
方法的重写、重载与动态连接构成多态性

Cat c = new Cat();       例化一个Cat的对象,这个不难理解。
 Animal a = new Cat();但当我这样定义时:

对于父类的方法 子类进行重写的话,父类的类型引用 会调用子类的方法 这就是动态链接

python
#Python中的垃圾回收
是以引用计数为主,分代收集为辅
在python 中 引用数是0 python就会回收这个对象

c1=ClassA()

会创建一个对象 这时c1的指针会指向内存地址 引用计数变为1
del c1后,c1变量不再指向内存,所以这块内存的引用计数减一,等于0,所以就销毁了这个对象,然后释放内存。

导致+1的情况
对象被创建 a=ClassA()
对象被引用 b=a
对象被做为参数传入 func(a)
对象被作为元素放在容器中 list1=[a,a]

导致 -1的情况
对象别名被销毁 del a
对象别名被赋予新的对象 a=b
对象离开他的作用域 函数中的局部变量
对象在容器中被销毁 离开容器

sys.getrefcount(a)可以查看a对象的引用计数,但是比正常计数大1
import sys
def func(c):
    print('in func function ',sys.getrefcount(c))

print('init ',sys.getrefcount(11))
a=11
print('a ',sys.getrefcount(a)) #被创建
b=a
print('a ',sys.getrefcount(a))#被引用
func(11)
#python 3 在getrefcount中采取使用自动减去1
print('after ',sys.getrefcount(a))#函数离开作用域
list1=[a,12,14]
print('after list ',sys.getrefcount(a))
a=12
print('after a=12 ',sys.getrefcount(11))

del a
print('after del a',sys.getrefcount(11))
#after del a 27 因为del a 为什么不变是因为 a引用的另一内存地址的对象
del b
print('after del b',sys.getrefcount(11))
del list1
print('after del list1',sys.getrefcount(11))

#循环引用导致泄露

def f2():
    while True:
        c1=ClassA()
        c2=ClassA()
        c1.t=c2
        c2.t=c1
        del c1
        del c2
f2()

在del c之后由于之前引用过一次 所以都为2 当被del 的时候都变为1 没有变为0
由于循环引用导致无法被回收

总结
项目中避免循环引用
引入gc模块,启动gc模块的自动清理循环引用的对象机制

#python format 用法
格式化字符串
通过对象属性

p=['kzc',18]
'{0[0]},{0[1]}'.format(p)
'kzc,18'

#python 传入参数的几个方法

位置传入

def func(a, b):
    print(a+b)

func(1, 2)  #3

默认参数

def add_end(l = []):
    l.append('END')
    return l

定义默认参数要牢记一点:默认参数必须指向不变对象!

#这才是可变参数,虽然在使用上和列表没有区别,但是参数nums接收到的是一个tuple(这些参数在传入时被自动组组装为一个元祖)
def calc(*nums):
    sum = 0
    for n in nums:
        sum += n
    return sum

>>> calc(1,2,3)
7

>>> my_ls = [1,2,3]
>>> calc(*my_ls)
7

可变参数允许传入0个~多个参数,而关键字参数允许在调用时以字典形式传入0个或多个参数(注意区别,一个是字典一个是列表);在传递参数时用等号(=)连接键和值

In [2]: def person(name,age,**kw):
   ...:     print('name',name,"age",age,"other",kw)
   ...: 

In [3]: person("xiaoming",12)
name xiaoming age 12 other {}

In [4]: person("dahuang",34,city="beijing")
name dahuang age 34 other {'city': 'beijing'}

python 的参数书写顺序一定要遵循,位置参数,默认参数,变长参数,关键词参数,命名关键词参数来写


标题:记一次电话面试
作者:xiantang
地址:http://xiantang.info/articles/2019/06/03/1559551043189.html

评论