python基础(三元运算+深浅拷贝+函数参数)
三元运算
三元运算,又称三目运算,主要作用是减少代码量,是对简单的条件语句的缩写。
书写格式:
result = 值1 if 条件 else 值2
即如果条件成立,则将值1赋给result变量,如果不成立,将值2赋给result变量
eg:name = "tina" if 1==1 else "fei"
name = "tina" if 1!=1 else "fei"
print(name)
执行结果如下:
fei
小练习:
a = 1 if True else 0
print(a)
b=1 if False else 0
print(b)
c = "Fire" if True else "Water"
print(c)
d = "Fire" if False else "Water"
print(d) 执行结果如下:
1
0
Fire
Water
深浅拷贝
import copy
#数字类型
n1 = 222
print(id(n1))
#赋值
n2 = n1
print(id(n2))
#字符串类型
n1 = "tina is a beauty"
n2 = n1
print(id(n1),id(n2))
###执行结果如下:
1638075088
1638075088
948823211080 948823211080
###由此可以看出字符串和数字类型的赋值,其内存指向的是同一块内存###
#浅拷贝
n1 = 22
n2 = "asdf"
n3 = copy.copy(n1)
n4 = copy.copy(n2)
print(id(n1),id(n3))
print(id(n2),id(n4))
执行结果如下:
1638068688 1638068688
168374752680 168374752680
###由此可以看出字符串和数字类型的浅拷贝,其内存指向的是同一块内存###
#深拷贝
n3 = copy.deepcopy(n1)
n4 = copy.deepcopy(n2)
print(id(n1),id(n3))
print(id(n2),id(n4))
执行结果如下:
1638068688 1638068688
778961474984 778961474984
###由此可以看出字符串和数字类型的深拷贝,其内存指向的是同一块内存###
画图说明:
#赋值
n1 = {"k1":"","k2":"tina",'k3':['beauty',123]}
n2 = n1
print(id(n1),id(n2))
执行结果如下:
1003839407944 1003839407944 # ###结合上面数字字符串的内容可以看出任何类型的赋值,其内存指向的是同一块内存###
#浅拷贝(在内存中开创一块空间,创建第一层数据,相当于只拷贝了索引)
import copy
n1 = {"k1":"","k2":"tina",'k3':['beau',123]}
n2 = copy.copy(n1)
print(id(n1),id(n2))
执行结果如下:
715111778248 712964936072
#内存地址是不一样的
#深拷贝(在内存中将与所有的数据重新创建一份,但由于python内部对数字和字符串的优化:永远指向同一块内存,所以最后一层不改变)
import copy
n1 = {"k1":"","k2":"tina",'k3':['beau',123]}
n2 = copy.deepcopy(n1)
print(id(n1),id(n2))
执行代码如下:
205036701640 205037113416
函数
1、概念:
- 面向过程编程:
根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处
- 函数式编程:
将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可,函数式编程最重要的是增强代码的重用性和可读性
- 面向对象编程:
对函数进行分类和封装,让开发“更快更好更强...”
2、函数的定义及使用:
def 函数名(参数):
......
函数体
......
返回值 函数定义的关键点:
- def:表示函数的关键字
- 函数名:函数的名称,日后根据函数名调用函数
- 函数体:函数中进行一系列的逻辑计算,如:发送邮件、计算出 [11,22,38,888]中的最大数等
- 参数:为函数体提供数据
- 返回值:当函数执行完毕后,可以给调用者返回数据
返回值不是必须的,如果没有return语句,则Python默认返回值None。
函数名的命名规则(跟变量一样):
函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号;
函数名是区分大小写的。
函数名不能是保留字。
3、函数的返回值:
返回值的作用是:判断函数是否执行成功,如果没有写return返回值时,默认返回none
函数是一个功能块,该功能到底执行成功与否,需要通过返回值来告知调用者。
例如:
def 发送短信():
发送短信的代码
。。。。。。
if 发送成功:
return True
else:
return False while True:
result = 发送短信()
if result == False:
记录日志,短信发送失败... # 每次执行发送短信函数,都会将返回值自动赋值给result
# 之后,可以根据result来写日志,或重发等操作
###函数的返回值###
#返回一个值:
def onevalue(a,b):
c = a + b
return c
print(onevalue(1,2))
#返回多个值:
def secondvalue(a,b,c):
d = a + b + c
return(a,b,c,d)
print(secondvalue(11,22,33))
#返回多个值:
def somevalue(a,b):
c = a + b
return (a,b,c)
x,y,z = somevalue(1,2)
print('x:',x,'y:',y,'z:',z)
执行结果如下:
3
(11, 22, 33, 66)
x: 1 y: 2 z: 3
4、函数参数:
(1)实现形式:
- 无参数时:
def CPU报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 def 硬盘报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 def 内存报警邮件()
#发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 while True: if cpu利用率 > 90%:
CPU报警邮件() if 硬盘使用空间 > 90%:
硬盘报警邮件() if 内存占用 > 80%:
内存报警邮件() 无参数实现
- 有参数时:
def 发送邮件(邮件内容) #发送邮件提醒
连接邮箱服务器
发送邮件
关闭连接 while True: if cpu利用率 > 90%:
发送邮件("CPU报警了。") if 硬盘使用空间 > 90%:
发送邮件("硬盘报警了。") if 内存占用 > 80%:
发送邮件("内存报警了。") 有参数实现
(2)参数的种类:
- 普通参数
形参,实参,传参
def email(p,text,subject):
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr msg = MIMEText(text,'plain','utf-8')
msg['From'] = formataddr(["菲菲",'wptawy@126.com'])
msg['To'] = formataddr(['hhhh','424662508@qq.com'])
msg['Subject'] = subject server = smtplib.SMTP('smtp.126.com',25)
server.login('wptawy@126.com','WW.3945.59')
server.sendmail('wptawy@126.com',[p,],msg.as_string())
server.quit()
email("1156997553@qq.com","youjianneirong","zhuti")
##其中,p,text,subject就是形参,"1156997553@qq.com","youjianneirong","zhuti"是实参,即实参是执行函数时实际传入的值。
######### 定义函数 ######### # name 即为函数aa的形式参数,简称:形参
def aa(name):
print name ######### 执行函数 #########
# 'tina' 就是函数func的实际参数,简称:实参
func('tina')
- 默认参数
def fun(name, age = 18):
print("%s:%d" %(name,age))
# 指定参数
fun('tina', 19)
# 使用默认参数
fun('tony')
执行结果如下:
tina:19
tony:18 注:默认参数需要放在参数列表最后
- 动态参数
(a)一个星号的动态参数(*args):
一个*号传递的参数默认定义为元祖类型
def f1(*a):
print(a,type(a))
f1(123,456,[222,33])
执行结果如下:
(123, 456, [222, 33]) <class 'tuple'>
def func(*args):
print(args) # 执行方式一
func(11,33,4,4454,5)
执行结果如下:
(11, 33, 4, 4454, 5) <class 'tuple'> # 执行方式二
li = [11,2,2,3,3,4,54]
func(*li)
执行结果如下:
(11, 2, 2, 3, 3, 4, 54) <class 'tuple'>
(b)两个星号的动态参数(**kwargs):
两个*号传递的参数默认定义为字典类型
def f1(**a):
print(a,type(a))
f1(k1=123,k2=456)
执行结果如下:
{'k1': 123, 'k2': 456} <class 'dict'>
def func(**kwargs):
print(kwargs,type(kwargs)) # 执行方式一
func(name='tina',age=18)
执行结果如下:
{'name': 'tina', 'age': 18} <class 'dict'> # 执行方式二
li = {'name':'tina', 'age':18, 'gender':'female'}
func(**li)
执行结果如下:
{'gender': 'female', 'name': 'tina', 'age': 18} <class 'dict'>
(c)*args和**kwargs的结合:
def f2(p,*a,**aa):
print(p,type(p))
print(a,type(a))
print(aa,type(aa))
f2(11,22,33,k1=123,k2=456)
执行结果如下:
11 <class 'int'>
(22, 33) <class 'tuple'>
{'k2': 456, 'k1': 123} <class 'dict'>
def show (*arg,**kwargs):
print (arg,type(arg))
print (kwargs,type(kwargs))
show([11,22,33],[44],['a','b'],k1='v1',k2='v2')
执行结果:
([11, 22, 33], [44], ['a', 'b']) <class 'tuple'>
{'k2': 'v2', 'k1': 'v1'} <class 'dict'> ##结论:同时传递两个带*号的参数,在形参定义里,第一个形参只能是带一个*号,第二个形参只能是带两个*号,同时在参数传递的时候,第一个参数只能是普通的定义,第二个参数是字典的定义 def show (*arg,**kwargs):
print (arg,type(arg))
print (kwargs,type(kwargs)) li = [[11,22,33],[44],['a','b']]
di = {'k1':'v1','k2':'v2'}
show (li,di) show(*li,**di) 执行结果:
([[11, 22, 33], [44], ['a', 'b']], {'k1': 'v1', 'k2': 'v2'}) <class 'tuple'>
{} <class 'dict'>
([11, 22, 33], [44], ['a', 'b']) <class 'tuple'>
{'k1': 'v1', 'k2': 'v2'} <class 'dict'> ##结论:通过第一种方式来传参数,python默认认为传到了第一个*号的形参那里,第二个*号不会接收参数。通过第二种方式来传递参数,才能将匹配的参数传给对应的形参。
(d)动态参数的应用
动态参数的应用:
s = '{0} is {1}'
li = ['tina','charming']
re = s.format(*li)
print(re) s = '{a} is {b}'
di = {'a':'tina','b':'charming'}
re = s.format(**di)
print(re) 执行结果为:
tina is charming
tina is charming
5、全局变量和局部变量:
全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为global。 但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。
PERSON = "tina"
def fun1():
a = 123
global PERSON
PERSON = "fei"
print(a)
def fun2():
a = 456
print(PERSON)
print(a)
fun1()
fun2() 执行结果如下:
123
fei
456
*注:全局变量要大写,局部变量要小写
python基础(三元运算+深浅拷贝+函数参数)的更多相关文章
- python基础-3 集合 三元运算 深浅拷贝 函数 Python作用域
上节课总结 1 运算符 in 字符串 判断 : “hello” in "asdasfhelloasdfsadf" 列表元素判断:"li" in ['li', ...
- Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数
一.上节课的重点回顾: 1.类名加括号其实就是执行类的__init__方法: 2.int a.创建方式 n1 = 123 #根据int类创建了一个对象 n2 = int(123) #根据int类创建一 ...
- python-Day3-set 集合-counter计数器-默认字典(defaultdict) -可命名元组(namedtuple)-有序字典(orderedDict)-双向队列(deque)--Queue单项队列--深浅拷贝---函数参数
上节内容回顾:C语言为什么比起他语言块,因为C 会把代码变异成机器码Pyhton 的 .pyc文件是什么python 把.py文件编译成的.pyc文件是Python的字节码, 字符串本质是 字符数组, ...
- python基础-三元运算和bytes数据
三元运算 进制 二进制,01 八进制,01234567 十进制,0123456789 十六进制,0123456789ABCDEF bytes类型 http://www.cnblogs. ...
- Python基础入门知识点——深浅拷贝
深浅拷贝 对象引用.浅拷贝.深拷贝(拓展.难点.重点) Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果 其实这个是由于共享内存导致的结果 拷贝 ...
- python基础:三元运算
学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即: 1 2 3 4 5 6 7 8 # 普通条件语句 if 1 == 1: name = 'wupeiqi' els ...
- python基础之全局局部变量及函数参数
1.局部变量和全局变量 1.1局部变量 局部变量是在函数内部定义的变量,只能在定义函数的内部使用 函数执行结束后,函数内部的局部变量会被系统收回 不同函数可以定义相同名字的局部变量,但是各用个的互不影 ...
- python基础三(深浅拷贝)
1.赋值操作 list_1 = [1,2,3,['barry','Jerry']] list_2 = list_1 list_1[0] = 111 print(list_1) # [111, 2, 3 ...
- python基础学习笔记——深浅拷贝
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 lst1 = ["⾦⽑狮王", "紫衫⻰王&qu ...
随机推荐
- FK JavaScript之:ArcGIS JavaScript添加Graphic,地图界面却不显示
使用ArcGIS JavaScript,往地图中添加几个Graphic,基本是与官网示例代码一致.绘制的图形一闪而过之后,就没了 核心代码如下: iniToolBar: function () { t ...
- ArcEngine:空间索引格网大小无效
参考如下帖子:http://www.cnblogs.com/linhugh/archive/2012/07/24/2606439.html\ C# 代码如下 IFeatureClass pNewFtC ...
- iOS9 HTTP传输安全
1.在Info.plist中添加 NSAppTransportSecurity 类型 Dictionary 2.在 NSAppTransportSecurity 下添加 NSAllowsArbitr ...
- Combination Lock
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Finally, you come to the interview room. You know that a Micr ...
- 有关segue的简介
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ViewControllerB *vc = segue ...
- C#编程利器之一:类(Class)【转】
C#编程利器之一:类(Class) 面向对象的程序设计(Object-Oriented Programming,简记为OOP)是一种功能非常强大的编程方法,立意于创建软件重用代码,以类为基础去思考编程 ...
- ultraedit正则使用
下面是从UltraEdit文档中摘录的语法说明: 正则表达式 (UltraEdit 语法): 符号 功能 % 匹配行首 – 表示搜索字符串必须在行首,但不包括任何选定的结果字符中的行终止字符. $ 匹 ...
- Linux下查看某个软件安装路径
1:如果包是通过yum或者rpm方式安装 [root@localhost yum.repos.d]# rpm -qa //找出系统所有的包,找到对应的文件名 [root@localhost yum.r ...
- Sql Server 性能优化之包含列
导读:数据数优化查询一直是个比较热门的话题,小生在这方面也只能算是个入门生.今 天我们就讲下数据库包含列这个一项的作用及带来的优化效果 引用下MSDN里面的一段解释: 当查询中的所有列都作为键列或非键 ...
- [转] 基于MySQL的秒杀核心设计(减库存部分)-防超卖与高并发
商品详情页面的静态化,varnish加速,秒杀商品库独立部署服务器这种就略过不讲了.只讨论库存部分的优化 mysql配置层面的优化可以参考我的这篇文章 <关于mysql innodb引擎性能优化 ...