Maison  >  Article  >  développement back-end  >  Résumé des questions de base sur Python (avec réponses)

Résumé des questions de base sur Python (avec réponses)

不言
不言avant
2018-12-13 11:15:3610292parcourir

Cet article vous apporte un résumé des questions de base sur Python (avec réponses). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

1. Pourquoi apprendre Python ?

La vie est trop courte ? Ce monde n'en vaut-il pas la peine ? Pensez à votre intention initiale !

2. Comment avez-vous appris Python ?

Site officiel, vidéos en ligne, sites d'apprentissage, forums, conseils d'experts

3 Comparaison entre Python et d'autres langages tels que Java, PHP, C, C#, C++ et ainsi de suite. ?

(1), code python, bref, clair, élégant, simple et facile à comprendre
(2), haute efficacité de développement
(3), forte évolutivité

4 , décrire brièvement les langages de programmation interprétés et compilés ?

Type interprété : lors de l'exécution du programme, l'ordinateur interprète le code un par un en langage machine pour que l'ordinateur l'exécute.
Type compilé : chaque instruction du programme source est compilée en langage machine, et. Enregistrez-le sous forme de fichier binaire, de sorte que lorsque l'ordinateur exécute le programme, il puisse exécuter le programme directement en langage machine et qu'il s'exécute très rapidement.

5. Types et caractéristiques des interpréteurs Python ?

Cpython, IPython, Jpython, pypy, Ironpython

Python est un langage interpréteur pour exécuter le code, il doit être exécuté via l'interpréteur. Il existe plusieurs interprètes pour Python, basés sur différents. langages de développement, chaque interprète a des caractéristiques différentes, mais ils peuvent tous exécuter du code Python normalement. Voici les cinq interprètes Python couramment utilisés :

CPython : Après avoir téléchargé et installé Python2.7 à partir du site officiel de Python, vous obtenez directement une version officielle de l'interpréteur : Cpython. Cet interpréteur est développé en langage C, il s'appelle donc CPython. Exécuter python sous la ligne nommée consiste à démarrer l'interpréteur CPython.

IPython : IPython est un interpréteur interactif basé sur CPython, c'est-à-dire qu'IPython n'est amélioré qu'en mode interactif, mais la fonction d'exécution du code Python est exactement la même que celle de CPython, comme beaucoup. l'apparence des navigateurs nationaux est différente, le noyau s'appelle en fait IE.

PyPy : PyPy est un autre interpréteur Python. Son objectif est la vitesse d'exécution. PyPy utilise la technologie JIT pour compiler dynamiquement le code Python, ce qui permet d'améliorer considérablement la vitesse d'exécution du code Python.

Jython : Jython est un interpréteur Python fonctionnant sur la plate-forme Java. Il peut directement compiler du code Python en bytecode Java pour l'exécution.

IronPython : IronPython est similaire à Jython, sauf qu'IronPython est un interpréteur Python fonctionnant sur la plate-forme Microsoft .Net et peut directement compiler du code Python en bytecode .Net.

Parmi les interpréteurs Python, CPython est largement utilisé pour la compilation Python, en plus d'utiliser l'interpréteur ci-dessus
pour la compilation, les développeurs hautement qualifiés peuvent également compiler selon leurs propres besoins. votre propre interpréteur Python pour exécuter du code Python, ce qui est très pratique !

6. Quelle est la relation entre les bits et les octets ?

Un octet = 8 bits

Quelle est la relation entre 7, b, B, KB, MB et GB ?

1B (octet) = 8b (bit)
1 Ko = 1024B
1 Mo = 1024 Ko
1 Go = 1024 Mo

8 Veuillez énumérer au moins 5 spécifications PEP8

(1), indentation : 4 indentations par niveau. Les continuations sur les lignes doivent utiliser des parenthèses ou des accolades ou utiliser des retraits suspendus.

(2), contraintes de longueur de code

Nombre de lignes et de colonnes dans une ligne : PEP8 stipule un maximum de 79 colonnes. Si l'URL est épissée, il est facile de dépasser la limite

A. fonction : ne peut pas dépasser 30 lignes ; intuitivement parlant, c'est suffisant pour afficher entièrement une fonction sur un seul écran, sans faire glisser de haut en bas
Une classe : pas plus de 200 lignes de code, pas plus de 10 méthodes <.> Un module : pas plus de 500 lignes

(3 ), import

Ne pas référencer plusieurs bibliothèques dans une seule phrase d'importation


(4), dénomination conventions

(5), commentaires


Principes généraux, Un mauvais commentaire est pire que pas de commentaire du tout. Alors quand un bout de code change, la première chose à faire est de modifier les commentaires !


9. Implémentez la conversion suivante via le code :

10 Veuillez écrire une fonction pour convertir l'adresse IP en un entier.
答案:      二进制转换成十进制:v = “0b1111011”
        print(int('0b1111011',2))
        十进制转换成二进制:v = 18
        print(bin(18))
        八进制转换成十进制:v = “011”
        print(int('011',8))
        十进制转换成八进制:v = 30
        print(oct(30))
        十六进制转换成十进制:v = “0x12”
        print(int('0x12',16))
        十进制转换成十六进制:v = 87
        print(hex(87))

Par exemple, dans 10.3.9.12, la règle de conversion est :

Concaténez ensuite les nombres binaires ci-dessus pour calculer le résultat décimal : 00001010 00000011 00001001 00001100 =?
    10            00001010
     3            00000011
     9            00001001
    12            00001100

Réponse :

11. Quel est le nombre maximum de niveaux de récursivité en python ?
def func(x):
    lis = x.strip().split('.')
    li = [bin(int(i)) for i in lis]
    li2 = [i.replace('0b',(10-len(i))*'0') for i in li]
    return int(''.join(li2),2)
ret = func('10.3.9.12')
print(ret)

La profondeur de récursion maximale par défaut d'un ordinateur général est d'environ 1000. La profondeur de récursion maximale de Python est généralement d'environ 4000. Elle est liée aux performances de l'ordinateur

Ce nombre n'est pas un nombre fixe. et peut être testé de la manière suivante


12 Trouvez le résultat :
import sys
print(sys.getrecursionlimit())
print(sys.setrecursionlimit(10000))

v1 = 1 ou 3 --------------> 1

v2 = 1 et 3-- ------------>3

v3 = 0 et 2 et 1------------->0
v4 = 0 et 2 ou 1---- ----->1
v5 = 0 et 2 ou 1 ou 4---->1
v6 = 0 ou Flase et 1-- --->Faux

13. Quelle est la différence entre ascii, unicode, utf-8 et gbk ?

Code ASCII : utilise un codage sur un octet, sa plage est donc essentiellement composée uniquement de lettres anglaises, de chiffres et de certains symboles spéciaux, seulement 256 caractères.

Unicode : peut représenter tous les octets du monde

GBK : il est uniquement utilisé pour coder les caractères chinois. Le nom complet de GBK est "Chinese Character Internal Code Extension Specification" et utilise un codage à deux octets.
UTF-8 : Il s'agit d'un codage de caractères de longueur variable pour Unicode, également connu sous le nom de Universal Code.

14. Quelle est la différence entre le bytecode et le code machine ?

机器码:是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂
字节码:是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。

15、三元运算规则以及应用场景?

规则:为真时的结果 if 判定条件 else 为假时的结果
`应用场景:在赋值变量的时候,可以直接加判断,然后赋值`

16、列举 Python2和Python3的区别?

1、默认编码:2-->ascii,3-->utf-8

2、print的区别:python2中print是一个语句,不论想输出什么,直接放到print关键字后面即可。python3里,print()是一个函数,像其他函数一样,print()需要你将要输出的东西作为参数传给它。

3、input的区别:

python2有两个全局函数,用在命令行请求用户输入。第一个叫input(),它等待用户输入一个python表达式(然后返回结果)。
第二个叫做raw_input(),用户输入什么他就返回什么。python3 通过input替代了他们。

4、字符串:python2中有两种字符串类型:Unicode字符串和非Unicode字符串。Python3中只有一种类型:Unicode字符串。

5、xrange():

python2里,有两种方法获得一定范围内的数字:range(),返回一个列表,还有xrange(),返回一个迭代器。
python3 里,range()返回迭代器,xrange()不再存在。

17、用一行代码实现数值交换:

a = 1
b = 2

答案:a = 1

b = 2
a,b = b,a

18、Python3和Python2中 int 和 long的区别?

python2有非浮点数准备的int和long类型。int类型最大
值不能超过sys.maxint,而且这个最大值是平台相关的。
可以通过在数字的末尾附上一个L来定义长整型,显然,它比int类型表示的数字范围更大。在python3里,
只有一种整数类型int,大多数情况下,和python2中的长整型类似。

19、xrange和range的区别?

python2里,有两种方法获得一定范围内的数字:range(),返回一个列表,还有xrange(),返回一个迭代器。
python3 里,range()返回迭代器,xrange()不再存在。

20、文件操作时:xreadlines和readlines的区别?

readlines返回一个list,xreadlines方法返回一个生成器

21、列举布尔值为False的常见值?

0, [] , () , {} , '' , False , None

22、字符串、列表、元组、字典每个常用的5个方法?

字符串:repleace,strip,split,reverse,upper,lower,join.....
列表:append,pop,insert,remove,sort,count,index.....
元组:index,count,__len__(),__dir__()
字典:get,keys,values,pop,popitems,clear,update,items.....

23、lambda表达式格式以及应用场景?

表达式格式:lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。冒号前是参数,冒号后是返回值。例如:lambda x : 2x
应用场景:经常与一些内置函数相结合使用,比如说map(),filter(),sorted(),reduce()等

24、pass的作用?

1、空语句 do nothing
2、保证格式完整
3、保证语义完整

25、arg和*kwarg作用?

万能参数,解决了函数参数不固定的问题
*arg:会把位置参数转化为tuple
**kwarg:会把关键字参数转化为dict

26、is和==的区别?

is:判断内存地址是否相等
==:判断数值是否相等

27、简述Python的深浅拷贝以及应用场景?

copy():浅copy,浅拷贝指仅仅拷贝数据集合的第一层数据
deepcopy():深copy,深拷贝指拷贝数据集合的所有层

28、Python垃圾回收机制?

python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收、分代回收)两种机制为辅的策略
计数机制

Python的GC模块主要运用了引用计数来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除”
解决容器对象可能产生的循环引用的问题。通过分代回收以空间换取时间进一步提高垃圾回收的效率。

标记-清除:

标记-清除的出现打破了循环引用,也就是它只关注那些可能会产生循环引用的对象
缺点:该机制所带来的额外操作和需要回收的内存块成正比。

隔代回收

原理:将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”,
垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾,
就应该减少对它的垃圾收集频率。那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量,
如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。

29、python的可变类型和不可变类型?

不可变类型(数字、字符串、元组、不可变集合)
可变类型(列表、字典、可变集合)

30、求结果:

v = dict.fromkeys([&#39;k1&#39;,&#39;k2&#39;],[])
   v[&#39;k1&#39;].append(666)
   print(v)
   v[&#39;k1&#39;] = 777
   print(v)
答案:{'k1':[666],'k2':[666]}
     {'k1':777,'k2':[666]}
解析:formkeys()默认参数为可变数据类型时有坑

31、求结果:

def num():
    return [lambda x: i*x for i in range(4)]
print([m(2) for m in num()])

答案:[6, 6, 6, 6]
解析: 问题的本质在与python中的属性查找规则,LEGB(local,enclousing,global,bulitin),
    在上面的例子中,i就是在闭包作用域(enclousing),而Python的闭包是 迟绑定 ,
    这意味着闭包中用到的变量的值,是在内部函数被调用时查询得到的
    所以:[lambda x: i*x for i in range(4)]打印出来是含有四个内存地址的列表,每个内存地址中的i
        在在本内存中都没有被定义,而是通过闭包作用域中的i值,当for循环执行结束后,i的值等于3,所以
        再执行[m(2) for m in num()]时,每个内存地址中的i值等于3,当x等于2时,打印出来的结果都是6,
        从而得到结果[6, 6, 6, 6]。

32、列举常见的内置函数?

map,filter,zip,len,bin,oct,hex,int,float,bool,sum,min,max,str,list,tuple,dict,range,next,hash,help,id.....

33、filter、map、reduce的作用?

filter(function,iterable)过滤函数
map(function,iterable)循环函数
reduce(function, iterable)累积函数

34、一行代码实现9*9乘法表。

lis = ['%s%s=%s'%(i,j,ij) for i in range(1,10) for j in range(i,10)]

35、如何安装第三方模块?以及用过哪些第三方模块?

pip3 imstall 模块名
django,Matplotlib,Tornado,PyGame

36、至少列举8个常用模块都有那些?

os,sys,time,random,re,hashlib,logging,json,pickle....

37、re的match和search区别?

match:从字符串的开头位置匹配,必须以此为开头
search:从开头开始查,找到符合的就返回结果

38、什么是正则的贪婪匹配?

正则表达式一般趋向于最大长度匹配

39、求结果:

a. [ i % 2 for i in range(10) ] ===>[0,1,0,1,0,1,0,1,0,1]
b. ( i % 2 for i in range(10) )===>返回一个生成器的内存地址

40、求结果:

a. 1 or 2 =========>1
b. 1 and 2 ========>2
c. 1 e74700f0fad84c14ec8341c65953be86false
d. 1 58633b6706f4579aa07aa9fef9094fa8ture

41、def func(a,b=[]) 这种写法有什么坑?

def func(a,b=[]):

 b.append(a)
 print(b)

函数的第二个默认参数是一个list,当第一次执行的时候实例化了一个list,
第二次执行还是用第一次执行的时候实例化的地址存储,以后每次实例化都是

42、如何实现 "1,2,3" 变成 ['1','2','3'] ?

a = "1,2,3"
li = a.split(&#39;,&#39;)

43、如何实现[‘1’,’2’,’3’]变成[1,2,3] ?

li = [&#39;1&#39;,&#39;2&#39;,&#39;3&#39;]
lis = list(map(lambda x:int(x) li))

44、比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?

a = [1,2,3]正常的列表
b = [(1),(2),(3)] 虽然列表的每个元素加上了括号,但是当括号内只有一个元素并且没有逗号时,其数据类型是元素本身的数据类型
b = [(1,),(2,),(3,)]列表中的元素类型都是元组类型

45、如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?

li = [x*x for x in range(1,11)]

46、一行代码实现删除列表中重复的值 ?

li = [1, 1, 1, 23, 3, 4, 4]
new_li = list(set(li))
new_li.sort(key=li.index)

47、如何在函数中设置一个全局变量 ?

使用python的内置语法 globals 全局变量

48、logging模块的作用?以及应用场景?

logging模块的作用:
1、程序调试
2、了解软件程序运行情况,是否正常
3、软件程序运行故障分析与问题定位
应用场景:网站的运维工作,程序实时监控

49、请用代码简答实现stack 。

def Stack(object):

def __init__(self):
    self.stack = []

def push(self,value):
    # 进栈
    self.stack.append(value)

def pop(self):
    # 出栈
    if self.stack:
        self.stack.pop()
    else:
        raise LookupError('stack is empty!')

def is_empty(self):
    # 查看stack是否为空
    reture bool(self.stack)

def top(self):
    # 取出stack中最新的值
    return self.stack[-1]

50、常用字符串格式化哪几种?

1、%s %d
2、format格式化输出
3、print(f'内容{变量名}')

51、简述 生成器、迭代器、可迭代对象 以及应用场景?

生成器:在 Python 中,一边循环一边计算的机制,称为 生成器(generator),

    通过next()取值,两种表现形式1、将列表生成式的[]改为()2、含有yield关键字的函数
    应用场景:优化代码,节省内存

迭代器:是访问集合元素的一种方式。迭代器同时实现了__iter__和__next__方法
可迭代对象:只要实现了__iter__方法的对象就是可迭代对象

52、用Python实现一个二分查找的函数。

lis = [0, 1, 3, 4, 5, 6, 7, 9, 10, 11,12,16,17]

def two_find(x, lis, start=0, end=None):

if end == None:end = len(lis) - 1
num = (end - start) // 2 + start
if end > start:
    if lis[num] > x:
        return two_find(x, lis, start=start, end=num)
    elif lis[num] 5fa6d34985dc0989b0c4dd7549f0a6a6>> import json
    >>> class ComplexEncoder(json.JSONEncoder):
    ...     def default(self, obj):
    ...         if isinstance(obj, complex):
    ...             return [obj.real, obj.imag]
    ...         return json.JSONEncoder.default(self, obj)
    ...
    >>> dumps(2 + 1j, cls=ComplexEncoder)
        '[2.0, 1.0]'
    >>> ComplexEncoder().encode(2 + 1j)
        '[2.0, 1.0]'
    >>> list(ComplexEncoder().iterencode(2 + 1j))
        ['[', '2.0', ', ', '1.0', ']']

import json
import datetime
ret = datetime.datetime.now()
class CJsonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.date):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        else:
            return json.JSONEncoder.default(self, obj)

print(json.dumps(ret,cls=CJsonEncoder))

76、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?

在序列化是将json.dumps中的默认参数ensure_ascii改为False就可以保留中文了
json.dumps(obj,ensure_ascii=False)

77、什么是断言?应用场景?

assert 条件,'自定义错误提示(可有可无)' 例:assert 1 == 0,'这是一个低级的错误'
合约式设计是断言的经典应用,在一个正确的程序里,所有的前置条件和后置条件都将得到处理。
78、使用代码实现查看列举目录下的所有文件。
方法一:递归处理

import os
url = r'C:\Users\Mr.Wang\PycharmProjects\untitled\前段学习'

def check_file(url,li = []):
    if os.path.isdir(url):
        file_list = os.listdir(url)
        for ret in file_list:
            base_url = os.path.join(url,ret)
            if os.path.isfile(base_url):
                li.append(ret)
            else: check_file(base_url)
        return li
    else:return os.path.basename(url)

方法二:堆栈的思想处理

import os
url = r'C:\Users\Mr.Wang\PycharmProjects\untitled\python基础'

lis = [url]
while lis:
    url = lis.pop()
    ret_list = os.listdir(url)
    for name in ret_list:
        abs_path = os.path.join(url,name)
        if os.path.isdir(abs_path):
            lis.append(abs_path)
        else:print(name)

79、简述 yield和yield from关键字。

yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器当你调用这个函数的时候,
函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象,当你使用for进行迭代的时候,
函数中的代码才会执行

yield from 的主要功能是打开双向通道,把最外层的调用方与最内层的子生成器连接起来,
这样二者可以直接发送和产出值,还可以直接传入异常,而不用在位于中间的协程中添加大量处理异常的样板代码。
有了这个结构,协程可以通过以前不可能的方式委托职责。

80、代码实现六位随机验证码

import random
s = ''
for i in range(6):
    num = random.randint(0,9)
    alpha1 = chr(random.randint(65,90))
    alpha2 = chr(random.randint(97,122))
    ret = random.choice([num,alpha1,alpha2])
    s += str(ret)
print(s)

81、代码实现随机发红包功能

import random
def red_packge(money,num):
    li = random.sample(range(1,money*100),num-1)
    li.extend([0,money*100])
    li.sort()
    return [(li[index+1]-li[index])/100 for index in range(num)]

ret = red_packge(100,10)
print(ret)

--------------------------生成器版-------------------------------------------
import random
def red_packge(money,num):
    li = random.sample(range(1,money*100),num-1)
    li.extend([0,money*100])
    li.sort()
    for index in range(num):
        yield (li[index+1]-li[index])/100

ret = red_packge(100,10)
print(ret)

82、请尽可能列举python列表的成员方法,并给出列表操作的答案:

(1) a=[1, 2, 3, 4, 5], a[::2]=? a[-2:]=?
         a[::2]=[1,3,5], 
         a[-2:] = [4,5]

(2)一行代码实现对列表a中的偶数位置的元素进行加3后求和?
        sum([i+3 for i in a[::2]])

(3)将列表a的元素顺序打乱,再对a进行排序得到列表b,然后把a和b按元素顺序构造一个字典d。
       import  random
       random.shuffle(a)
       b=a.sort()
       d={}
       for i in range(len(a)):d[a[i]] = b[i]

83、Python自省

自省就是面向对象的语言所写的程序在运行时,就能知道对象的类型。也就是程序运行时能够获得对象的类型。比如type(),dir(),getattr(),hasattr(),isinstance()。

84、Python是如何进行内存管理的?

从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制

一、对象的引用计数机制

Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
引用计数增加的情况:
1,一个对象分配一个新名称
2,将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况:
1,使用del语句对对象别名显示的销毁
2,引用超出作用域或被重新赋值
sys.getrefcount( )函数可以获得对象的当前引用计数
多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。

二、垃圾回收

1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

三、内存池机制

Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

85、介绍一下except的用法和作用?

try…except…except…else…
-- 执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
-- try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行
-- 如果存在finally语句,最后总是会执行。

86、如何用Python来进行查询和替换一个文本字符串?

可以使用re模块中的sub()函数或者subn()函数来进行查询和替换,比replace的功能更强大!!!
格式:sub(replacement, string[,count=0])(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量)

import re
p=re.compile("blue|white|red")
print(p.sub('colour','blue socks and red shoes'))
print(p.sub('colour','blue socks and red shoes',count=1))

subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量

87、有没有一个工具可以帮助查找python的bug和进行静态的代码分析?

PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
Pylint是另外一个工具可以进行codingstandard检查

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer