Python Interview Questions And Answers Set - 5

本文将介绍如何使用Python标准库中的smtplib模块来发送邮件。包括从控制台接收输入,构造邮件内容并发送的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

How do I send mail from a Python script?
Use the standard library module smtplib.

Here's a very simple interactive mail sender that uses it. This method will work on any host that supports an SMTP listener.

import sys, smtplib

fromaddr = raw_input("From: ")
toaddrs = raw_input("To: ").split(',')
print "Enter message, end with ^D:"
msg = ''
while 1:
line = sys.stdin.readline()
if not line:
break
msg = msg + line

# The actual mail send
server = smtplib.SMTP('localhost')
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

A Unix-only alternative uses sendmail. The location of the sendmail program varies between systems; sometimes it is /usr/lib/sendmail, sometime /usr/sbin/sendmail. The sendmail manual page will help you out. Here's some sample code:

SENDMAIL = "/usr/sbin/sendmail" # sendmail location
import os
p = os.popen("%s -t -i" % SENDMAIL, "w")
p.write("To: receiver@example.com\n")
p.write("Subject: test\n")
p.write("\n") # blank line separating headers from body
p.write("Some text\n")
p.write("some more text\n")
sts = p.close()
if sts != 0:
print "Sendmail exit status", sts

How do I avoid blocking in the connect() method of a socket?
The select module is commonly used to help with asynchronous I/O on sockets.

Are there any interfaces to database packages in Python?
Yes.

Python 2.3 includes the bsddb package which provides an interface to the BerkeleyDB library. Interfaces to disk-based hashes such as DBM and GDBM are also included with standard Python.

How do I generate random numbers in Python?
The standard module random implements a random number generator. Usage is simple:

import random
random.random()

This returns a random floating point number in the range [0, 1).

Can I create my own functions in C?
Yes, you can create built-in modules containing functions, variables, exceptions and even new types in C.

Can I create my own functions in C++?
Yes, using the C compatibility features found in C++. Place extern "C" { ... } around the Python include files and put extern "C" before each function that is going to be called by the Python interpreter. Global or static C++ objects with constructors are probably not a good idea.

How can I execute arbitrary Python statements from C?
The highest-level function to do this is PyRun_SimpleString() which takes a single string argument to be executed in the context of the module __main__ and returns 0 for success and -1 when an exception occurred (including SyntaxError). If you want more control, use PyRun_String(); see the source for PyRun_SimpleString() in Python/pythonrun.c.

How can I evaluate an arbitrary Python expression from C?
Call the function PyRun_String() from the previous question with the start symbol Py_eval_input; it parses an expression, evaluates it and returns its value.

How do I extract C values from a Python object?
That depends on the object's type. If it's a tuple, PyTupleSize(o) returns its length and PyTuple_GetItem(o, i) returns its i'th item. Lists have similar functions, PyListSize(o) and PyList_GetItem(o, i).

For strings, PyString_Size(o) returns its length and PyString_AsString(o) a pointer to its value. Note that Python strings may contain null bytes so C's strlen() should not be used.

To test the type of an object, first make sure it isn't NULL, and then use PyString_Check(o), PyTuple_Check(o), PyList_Check(o), etc.

There is also a high-level API to Python objects which is provided by the so-called 'abstract' interface -- read Include/abstract.h for further details. It allows interfacing with any kind of Python sequence using calls like PySequence_Length(), PySequence_GetItem(), etc.) as well as many other useful protocols.

How do I call an object's method from C?
The PyObject_CallMethod() function can be used to call an arbitrary method of an object. The parameters are the object, the name of the method to call, a format string like that used with Py_BuildValue(), and the argument values:

PyObject *
PyObject_CallMethod(PyObject *object, char *method_name,
char *arg_format, ...);

This works for any object that has methods -- whether built-in or user-defined. You are responsible for eventually Py_DECREF'ing the return value.

To call, e.g., a file object's "seek" method with arguments 10, 0 (assuming the file object pointer is "f"):

res = PyObject_CallMethod(f, "seek", "(ii)", 10, 0);
if (res == NULL) {
... an exception occurred ...
}
else {
Py_DECREF(res);
}

Note that since PyObject_CallObject() always wants a tuple for the argument list, to call a function without arguments, pass "()" for the format, and to call a function with one argument, surround the argument in parentheses, e.g. "(i)".

How do I catch the output from PyErr_Print() (or anything that prints to stdout/stderr)?
In Python code, define an object that supports the write() method. Assign this object to sys.stdout and sys.stderr. Call print_error, or just allow the standard traceback mechanism to work. Then, the output will go wherever your write() method sends it.

The easiest way to do this is to use the StringIO class in the standard library.

Sample code and use for catching stdout:

>>> class StdoutCatcher:
... def __init__(self):
... self.data = ''
... def write(self, stuff):
... self.data = self.data + stuff
...
>>> import sys
>>> sys.stdout = StdoutCatcher()
>>> print 'foo'
>>> print 'hello world!'
>>> sys.stderr.write(sys.stdout.data)
foo
hello world!

How do I access a module written in Python from C?
You can get a pointer to the module object as follows:

module = PyImport_ImportModule("<modulename>");

If the module hasn't been imported yet (i.e. it is not yet present in sys.modules), this initializes the module; otherwise it simply returns the value of sys.modules["<modulename>"]. Note that it doesn't enter the module into any namespace -- it only ensures it has been initialized and is stored in sys.modules.

You can then access the module's attributes (i.e. any name defined in the module) as follows:

attr = PyObject_GetAttrString(module, "<attrname>");

Calling PyObject_SetAttrString() to assign to variables in the module also works.

How do I interface to C++ objects from Python?
Depending on your requirements, there are many approaches. To do this manually, begin by reading the "Extending and Embedding" document. Realize that for the Python run-time system, there isn't a whole lot of difference between C and C++ -- so the strategy of building a new Python type around a C structure (pointer) type will also work for C++ objects.

How do I tell "incomplete input" from "invalid input"?
Sometimes you want to emulate the Python interactive interpreter's behavior, where it gives you a continuation prompt when the input is incomplete (e.g. you typed the start of an "if" statement or you didn't close your parentheses or triple string quotes), but it gives you a syntax error message immediately when the input is invalid.

In Python you can use the codeop module, which approximates the parser's behavior sufficiently. IDLE uses this, for example.

The easiest way to do it in C is to call PyRun_InteractiveLoop() (perhaps in a separate thread) and let the Python interpreter handle the input for you. You can also set the PyOS_ReadlineFunctionPointer to point at your custom input function. See Modules/readline.c and Parser/myreadline.c for more hints.

However sometimes you have to run the embedded Python interpreter in the same thread as your rest application and you can't allow the PyRun_InteractiveLoop() to stop while waiting for user input. The one solution then is to call PyParser_ParseString() and test for e.error equal to E_EOF, which means the input is incomplete). Here's a sample code fragment, untested, inspired by code from Alex Farber:
#include <Python.h>
#include <node.h>
#include <errcode.h>
#include <grammar.h>
#include <parsetok.h>
#include <compile.h>

int testcomplete(char *code)
/* code should end in \n */
/* return -1 for error, 0 for incomplete,
1 for complete */
{
node *n;
perrdetail e;

n = PyParser_ParseString(code, &_PyParser_Grammar,
Py_file_input, &e);
if (n == NULL) {
if (e.error == E_EOF)
return 0;
return -1;
}

PyNode_Free(n);
return 1;
}


Another solution is trying to compile the received string with Py_CompileString(). If it compiles without errors, try to execute the returned code object by calling PyEval_EvalCode(). Otherwise save the input for later. If the compilation fails, find out if it's an error or just more input is required - by extracting the message string from the exception tuple and comparing it to the string "unexpected EOF while parsing". Here is a complete example using the GNU readline library (you may want to ignore SIGINT while calling readline()):
#include <stdio.h>
#include <readline.h>

#include <Python.h>
#include <object.h>
#include <compile.h>
#include <eval.h>

int main (int argc, char* argv[])
{
int i, j, done = 0; /* lengths of line, code */
char ps1[] = ">>> ";
char ps2[] = "... ";
char *prompt = ps1;
char *msg, *line, *code = NULL;
PyObject *src, *glb, *loc;
PyObject *exc, *val, *trb, *obj, *dum;

Py_Initialize ();
loc = PyDict_New ();
glb = PyDict_New ();
PyDict_SetItemString (glb, "__builtins__",
PyEval_GetBuiltins ());

while (!done)
{
line = readline (prompt);

if (NULL == line) /* CTRL-D pressed */
{
done = 1;
}
else
{
i = strlen (line);

if (i > 0)
add_history (line);
/* save non-empty lines */

if (NULL == code)
/* nothing in code yet */
j = 0;
else
j = strlen (code);

code = realloc (code, i + j + 2);
if (NULL == code)
/* out of memory */
exit (1);

if (0 == j)
/* code was empty, so */
code[0] = '\0';
/* keep strncat happy */

strncat (code, line, i);
/* append line to code */
code[i + j] = '\n';
/* append '\n' to code */
code[i + j + 1] = '\0';

src = Py_CompileString (code, " <stdin>", Py_single_input);

if (NULL != src)
/* compiled just fine - */
{
if (ps1 == prompt ||
/* ">>> " or */
'\n' == code[i + j - 1])
/* "... " and double '\n' */
{
/* so execute it */
dum = PyEval_EvalCode ((PyCodeObject *)src, glb, loc);
Py_XDECREF (dum);
Py_XDECREF (src);
free (code);
code = NULL;
if (PyErr_Occurred ())
PyErr_Print ();
prompt = ps1;
}
}
/* syntax error or E_EOF? */

else if (PyErr_ExceptionMatches (PyExc_SyntaxError))
{
PyErr_Fetch (&exc, &val, &trb);
/* clears exception! */

if (PyArg_ParseTuple (val, "sO", &msg, &obj) &&
!strcmp (msg, "unexpected EOF while parsing")) /* E_EOF */
{
Py_XDECREF (exc);
Py_XDECREF (val);
Py_XDECREF (trb);
prompt = ps2;
}
else
/* some other syntax error */
{
PyErr_Restore (exc, val, trb);
PyErr_Print ();
free (code);
code = NULL;
prompt = ps1;
}
}
else
/* some non-syntax error */
{
PyErr_Print ();
free (code);
code = NULL;
prompt = ps1;
}

free (line);
}
}

Py_XDECREF(glb);
Py_XDECREF(loc);
Py_Finalize();
exit(0);
}
一、数据操作 1.增加数据 1)增加一行数据——增加全部值 insert into 表名 values(…); 注意: a)数据值需要和表的字段完全对应(数据个数和数据类型) b)主键列是自动增长,插入时需要占位,通常使用0或者default或者null来占位 举例: insert into students values(0,'张三',28,1.78); 2)增加一行数据——增加部分值 insert into 表名(字段1,…) values(值1,…); 举例: insert into students values(0,'张三',28,1.78); insert into students(name,height) values('李四',1.68); 3)增加多行数据 a)方法一:多句执行单行插入语句,以分号隔开 举例: insert into students values(0,'王五',23,1.67); insert into students(name,height) values ('赵六',1.82); b)方法二:在插入单行数据的语句上,value后边的数据进行多组化处理 insert into 表名 vaues(…),(…); insert into 表名(列1,…)values(值1,…),(值1,…)…; 举例: insert into students values(0,'张一',21,1.81),(1,'张二',30,1.65); insert into students(name,height) values('李三',1.54),(李四'',1.87); 2.修改数据 1)修改数据 update 表名 set 列1=值1,列2=值2… where 条件; 注意:where如果省略,代表修改整列数据,不建议省略where 举例:update students set age=48 where id=9; 3.删除数据 1)删除数据 delete from 表名 where 条件; 注意:where如果省略,代表删除全部数据,不建议省略where 举例:delete from students where id=6; 2)逻辑删除 对于重要的数据,不能轻易执行delete删除语句,因为一旦删除,数据无法回复,这时会用到逻辑删除。表中增加字段isdelete,0代表未删除,1代表删除,默认值0,当需要删除某条数据时,设置该条数据的isdelete字段为1 举例: update students set isdelete=1 where id=4; select *from students where isdelete=0; 3)其他删除方法 delete from 表名 ——删除所有数据,但是不重置主键字段的计数 truncate table 表名 ——删除所有数据,并重置主键字段的计数 drop table 表名 ——删掉表(字段和数据均不再存在) 举例: delete from students; truncate table students; drop table students; 4.查询语句 1)基本查询 a)查询表内所有数据 select *from 表名; 举例:select *from students; b)查询表内部分字段 select 字段名1,字段名2 from 表名; 举例:select name,age from students; c)字段起别名查询 select 字段名 as '别名' from 表名; (引号可以省略,as也可以省略) select name as '姓名' from students; 起别名的作用:1)美化数据结果的显示效果 2)可以起到隐藏真正字段名的作用 d)去重查询 select distinct(字段名) from 表名; 举例:select distinct(company) from goods; 2)条件查询 a)逻辑运算符 select *from goods where price >30 and company != ''PDD; b)模糊查询 like % 举例: select *from goods where remark like '%一次性%'; ——关键词在中间 select *from goods where remark like '%一次性'; ——关键词在末尾 selects *from goods where remark like '一次性%'; ——关键词在开头 c)范围查询 查询价格范围在30-100的商品信息 举例:select *from goods where price between 30 and 100; d)判断空查询 i)查询描述为空的所有商品 select *from goods where remark is null; ii)查询有描述信息的所有商品 select *from goods where remark is not null; 3)其他复杂查询 a)排序 查询说明:查询所有商品信息,按照价格从大到小排序,价格相同时,按照数量由少到多排序 select *from 表名 order by 列1 asc|desc ,列2 asc|desc,… 说明:order by ——排序;asc ——升序 ;desc ——降序 select *from goods order by price desc,count asc; 默认排序为升序,上面的asc可以省略,修改为:select *from goods order by price desc,count; b)聚合函数 i)统计记录总数 select count(*) from goods; 扩展:可以增加筛选条件,如:select count(*) from goods where name = '矿泉水'; ii)其他 select max(price) from goods; ——最高商品价格 select min(price) from goods; ——最低商品价格 select avg(price) from goods; ——商品平均价格 select sum(amount) from goods where remark like '%一次性%'; ——一次性商品的总金额 c)分组 i)分组查询 select 字段1,字段2,聚合… from 表名 group by 字段1,字段2… select sum(amount) from goods group by company; ——按照公司名称分组统计各个公司的金额总数 还可以分组统计数量:select count(*) from goods group by company; ii)分组后加条件过滤 select 字段1,字段2,聚合… from 表名 where 条件 group by 字段 having 条件; 举例:显示每个地区的总人口数和总面积,仅显示那些面积超过1000000的地区 select region,sum(population),sum(area) from bbc group by region having sum(area)>1000000; where 和having的区别 where是对from后面指定的表进行数据筛选,属于对原始数据的筛选 having是对group by 的结果进行筛选 having后面的条件中可以用聚合函数,where后面不可以 4)分页查询 select *from 表名 limit start,count; 举例: select *from goods limit 0,5; ——获取前5条数据 select *from goods limit 5; ——默认从一条取值,0可以省略 扩展: select *from goods order by price desc limit 1; ——查询商品价格最贵的一条数据信息 select *from goods order by price desc limit 3; ——查询商品价格最贵的前三条数据信息 5.连接查询 1)内连接 select *from 表1 inner join 表2 on 表1.列=表2.列 内连接查询,按照图表表示如下:取的值是A和B的交集,也就是A和B都有的数据才能查出来 A表和B表结构如下: select *from A inner join B on A.id=B.id; 还可以写成:select *from A join B on A.id=B.id; 或者select *from A , B where A.id=B.id; 取出来的数据是id为1,2,3 2)左连接(左外连接) select *from 表1 left join 表2 on 表1.列=表2.列 左连接查询,按照图表表示如下:取的值是A的全部加上A和B的交集部分 select *from A left join B on A.id=B.id; 还可以写成:select *from A left outer join B on A.id=B.id; 取出来的数据是id为1,2,3,4 3)右连接(右外连接) select *from 表1 right join 表2 on 表1.列=表2.列 右连接查询,按照图表表示如下:取的值是B的全部加上A和B的交集部分 select *from A right join B on A.id=B.id; 还可以写成:select *from A right outer join B on A.id=B.id; 取出来的数据是id为1,2,3 4)全连接 取的是A和B两个表的全部 select *from A left join B on A.id=B.id union select *from A right join B on A.id=B.id; 或者select *from A full join B on A.id=B.id; 6.子查询语句充当查询条件或数据源 1)子查询语句充当查询条件 select *from goods where price > (select avg(price)from goods); ——查询价格高于平均价的商品信息 2)子查询语句充当数据源 select *from (select *from goods go left join category ca on go.typeid=ca.typeid) new where new.company = ''PDD; ——查询所有来自PDD的商品信息,包含商品分类 其中,goods 别名go category别名ca 二、数据类型和约束 1.数据类型 1)整数: int 有符号范围(-2147483648 ~2147483647),⽆符号 (unsigned)范围(0 ~ 4294967295) 2)⼩数: decimal 例如:decimal(5,2) 表示共存5位数,⼩数占2位,整数占3 位 3)字符串: varchar 范围(0~65533),例如:varchar(3) 表示最多存3个字 符,⼀个中⽂或⼀个字 ⺟都占⼀个字符 4)⽇期时间: datetime 范围(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59),例如:'2020-0101 12:29:59' 2.约束 1)主键(primary key) 能唯⼀标识表中的每⼀条记录的属性组 2)⾮空(not null) 此字段不允许填写空值 3)唯⼀(unique) 此字段的值不允许重复 4)默认值(default) 当不填写此值时会使⽤默认值,如果填写时以填写为准 5) 外键(foreign key) ⼀个表中的⼀个字段引⽤另⼀个表的主键 说明: 通过外部数据表的字段, 来控制当前数据表的数据内容变更, 以避免单⽅⾯移除数据, 导致关联表数据产⽣垃圾数据的⼀种⽅法。 注意: 如果⼤量增加外键设置, 会严重影响除数据查询操作以外的其他操作(增/ 删/改)的操作效率。 6)索引 说明: 为字段添加索引,可以⼤幅度提⾼查询语句的执⾏效率。 注意: 如果⼤量增加索引设置, 会严重影响除数据查询操作以外的其他操作(增/ 删/改)的操作效率, 故不⽅便过多添加。 ———————————————— 将内容变为面试题格式 生成一个word 一问一答
最新发布
08-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值