Python 基础之函数、深浅copy,set及练习
三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python 2.4以上才有了三元操作。
语法格式:
X if C else Y
有了三元表达式,你只需一行就能完成条件判断和赋值操作:
x, y = 3, 4
if x<y :
smaller= x
else
smaller =y
现在 只需一句:
smaller = x if x<y else y
基本数据类型补充之 set
set集合,是一个无序且不重复的元素集合。
class set(object):
"""
set() -> new empty set object
set(iterable) -> new set object Build an unordered collection of unique elements.
"""
def add(self, *args, **kwargs): # real signature unknown
"""
Add an element to a set,添加元素 This has no effect if the element is already present.
"""
pass def clear(self, *args, **kwargs): # real signature unknown
""" Remove all elements from this set. 清除内容"""
pass def copy(self, *args, **kwargs): # real signature unknown
""" Return a shallow copy of a set. 浅拷贝 """
pass def difference(self, *args, **kwargs): # real signature unknown
"""
Return the difference of two or more sets as a new set. A中存在,B中不存在 (i.e. all elements that are in this set but not the others.)
"""
pass def difference_update(self, *args, **kwargs): # real signature unknown
""" Remove all elements of another set from this set. 从当前集合中删除和B中相同的元素"""
pass def discard(self, *args, **kwargs): # real signature unknown
"""
Remove an element from a set if it is a member. If the element is not a member, do nothing. 移除指定元素,不存在不保错
"""
pass def intersection(self, *args, **kwargs): # real signature unknown
"""
Return the intersection of two sets as a new set. 交集 (i.e. all elements that are in both sets.)
"""
pass def intersection_update(self, *args, **kwargs): # real signature unknown
""" Update a set with the intersection of itself and another. 取交集并更更新到A中 """
pass def isdisjoint(self, *args, **kwargs): # real signature unknown
""" Return True if two sets have a null intersection. 如果没有交集,返回True,否则返回False"""
pass def issubset(self, *args, **kwargs): # real signature unknown
""" Report whether another set contains this set. 是否是子序列"""
pass def issuperset(self, *args, **kwargs): # real signature unknown
""" Report whether this set contains another set. 是否是父序列"""
pass def pop(self, *args, **kwargs): # real signature unknown
"""
Remove and return an arbitrary set element.
Raises KeyError if the set is empty. 移除元素
"""
pass def remove(self, *args, **kwargs): # real signature unknown
"""
Remove an element from a set; it must be a member. If the element is not a member, raise a KeyError. 移除指定元素,不存在保错
"""
pass def symmetric_difference(self, *args, **kwargs): # real signature unknown
"""
Return the symmetric difference of two sets as a new set. 对称差集 (i.e. all elements that are in exactly one of the sets.)
"""
pass def symmetric_difference_update(self, *args, **kwargs): # real signature unknown
""" Update a set with the symmetric difference of itself and another. 对称差集,并更新到a中 """
pass def union(self, *args, **kwargs): # real signature unknown
"""
Return the union of sets as a new set. 并集 (i.e. all elements that are in either set.)
"""
pass def update(self, *args, **kwargs): # real signature unknown
""" Update a set with the union of itself and others. 更新 """
pass
创建set:
s = set([1,2,3])
s = {1,2,3}
set函数:
s.add(x) #添加元素x到集合s
s.clear() #删除所有元素集
s.copy() #新设置的浅拷贝
s.difference(t) #差分操作: s 中的元素,而不是t 中的元素,通俗讲s中有的,t中没有的-->s - t
s.difference_update(t) #返回删除元素后集合s t-->s -= t
s.discard(t) #如果t是集合s 中的元素,从集合s 中删除t
s.intersection(t) #返回交集到新集合-->s & t
s.intersection_update(t) #取交集并更更新到s中-->s &= t
s.isdisjoint(t) #如果没有交集,返回True,否则返回False
s.issubset(t) #s 中所有的元素都是t 的成员,子集 -->s <= t
s.isupperset(t)# t 中所有的元素都是s 的成员,父集 --> s >= t
s.pop() #删除集合s 中的任意一个对象,并返回它
s.remove(x) #从集合s 中删除对象x;如果x 不是集合s 中的元素(obj not in s),将引发KeyError 错误
s.symmetric_difference(t) #对称差分操作:s 或t 中的元素,但不是s 和t 共有的元素-->s ^ t
symmetric_difference_update #s 中的成员更新为那些包含在s 或t中,但不是s和t 共有的元素-->s ^= t
s.union(t) #合并操作:s 或t 中的元素--> s | t
s.update(t) #用t 中的元素修改s, 即s 现在包含s 或t 的成员--> s |= t
深浅copy
一、数字和字符串
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。
2. copy.deepcopy 深拷贝 拷贝对象及其子对象
ps:str,int 深浅copy内存地址都是一样的
import copy
# ######### 数字、字符串 #########
n1 = 123
# n1 = "i am alex age 10"
print(id(n1))
# ## 赋值 ##
n2 = n1
print(id(n2))
# ## 浅拷贝 ##
n2 = copy.copy(n1)
print(id(n2)) # ## 深拷贝 ##
n3 = copy.deepcopy(n1)
print(id(n3))
如下图:
对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。
二、其他基本数据类型
1、赋值
赋值,只是创建一个变量,该变量指向原来内存地址,如:
n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
n2 = n1
2、浅拷贝
import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n3 = copy.copy(n1)
深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)
如下图:
def fib3(a):
if a ==0 or a ==1:
return a
else:
return (fib3(a-1)+fib3(a-2))
ret = fib3(10)
print(ret)
3、深拷贝
import copy n1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]} n4 = copy.deepcopy(n1)
函数:
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
函数定义规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
参数:
- 必备参数 :必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
- 关键字参数 :关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
- 默认参数 :调用函数时,缺省参数的值如果没有传入,则被认为是默认值。 放在参数的尾部
- 不定长参数:*args ,**kwargs
局部变量和全局变量
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
- 全局变量
- 局部变量
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中,如果想修改变全部变量就需要globals
#!/usr/bin/python
# -*- coding: UTF-8 -*- TOTAL = 0; # 这是一个全局变量
def sum( arg1, arg2 ):
#返回2个参数的和."
total = arg1 + arg2; # total在这里是局部变量.
print "函数内是局部变量 : ", total
return total; #调用sum函数
sum( 10, 20 );
print "函数外是全局变量 : ", TOTAL >>>函数内是局部变量 : 30
>>>函数外是全局变量 : 0
练习题
# 数据库中原有
old_dict = {
"#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
"#2":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
"#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 }
} # cmdb 新汇报的数据
new_dict = {
"#1":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 800 },
"#3":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 },
"#4":{ 'hostname':'c1', 'cpu_count': 2, 'mem_capicity': 80 }
}
code:
# old_set = set(old_dict.keys())
# new_set = set(new_dict.keys())
#需要删除
# old_dict_a = old_set.difference(new_dict) #删除old_dict ,new_dict中没有的 ,
# old_set.remove(*old_dict_a)
# print(old_set)
#需要新建:?
# ret = new_set.difference(old_set)
# old_set.add(*ret)
# print(old_set) #需要更新:?
#old_set.intersection_update(new_set)#new_dit中的值,old_set中 -->取交集更新到a 。
1、简述普通参数、指定参数、默认参数、动态参数的区别
普通参数 :普通参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
指定参数 :指定参数和函数调用关系紧密,函数调用使用指定参数来确定传入的参数值。
默认参数 :调用函数时,缺省参数的值如果没有传入,则被认为是默认值。 放在参数的尾部
动态参数:*args ,**kwargs
2、写函数,计算传入字符串中【数字】、【字母】、【空格] 以及 【其他】的个数
def check_type(object):
int_all = 0
str_all = 0
space_all = 0
other_all = 0
for i in object:
if i.isdigit():
int_all+=1
elif i.isalpha():
str_all+=1
elif i.isspace():
space_all+=1
else:
other_all+=1
return ('数字:%s,字符串:%s,空格%s,其他:%s'%(int_all,str_all,space_all,other_all))
ret = check_type('asfa asddfa asf 23423 #@asf ')
print(ret)
3、写函数,判断用户传入的对象(字符串、列表、元组)长度是否大于5。
def is_object(object):
if len(object) >=5:
#print(object)
return ('对象大于等于5')
else:
return ('对象小于5')
a = (11,22,33,4,5,)
ret = is_object(a)
print(ret)
4、写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。
def check_object(object):
for i in a:
i = str(i)
if ' ' in i:
return ('空格元素:',i)
else:
return ('没有空格')
a = ('q wer','adf')
ret = check_object(a)
print(ret)
5、写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
def check_split(object):
if len(object) >2:
return (object[0:2])
else:
return object ret = check_split(('11','113',12))
print(ret)
6、写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。
def ol_num(object):
rec = []
for i in range(len(object)):
if i %2 ==1:
rec.append(object[i])
return rec
ret = ol_num([11,222,3,4,5,6,78,89,9])
print(ret)
7、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]} PS:字典中的value只能是字符串或列表
def dic_lent(**object):
new_dict = {}
for k,v in object.items():
if type(v) ==str:
new_dict[k] =v[0:2]
#print(new_dict)
elif type(v) == list:
new_dict[k] =v[0:2]
return (new_dict) dic = {"k1": "v1v1", "k2": [11,22,33,44]}
ret = dic_lent(**dic)
print(ret)
精简版
def dic_lent(**object):
new_dict = {}
for k,v in object.items():
new_dict[k] =v[0:2]
return (new_dict) dic = {"k1": [222,333,44,5,4], "k2": [11,22,33,44]}
ret = dic_lent(**dic)
print(ret)
8、写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者。
def fib3(a):
if 1 == a:
return 0
elif 2 ==a:
return 1
else:
return (fib3(a-1)+fib3(a-2))
ret = fib3(10)
print(ret)
def func(arg1,arg2):
if arg1 == 0:
print arg1, arg2
arg3 = arg1 + arg2
print arg3
func(arg2, arg3) func(0,1)
Python 基础之函数、深浅copy,set及练习的更多相关文章
- python基础(三)编码,深浅copy
编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...
- python基础——匿名函数
python基础——匿名函数 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算f(x)=x2时 ...
- python基础——返回函数
python基础——返回函数 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 我们来实现一个可变参数的求和.通常情况下,求和的函数是这样定义的: def calc_ ...
- python基础——sorted()函数
python基础——sorted()函数 排序算法 排序也是在程序中经常用到的算法.无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小.如果是数字,我们可以直接比较,但如果是字符串或者两个d ...
- python基础——filter函数
python基础——filter函数 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函 ...
- python基础——匿名函数及递归函数
python基础--匿名函数及递归函数 1 匿名函数语法 匿名函数lambda x: x * x实际上就是: def f(x): return x * x 关键字lambda表示匿名函数,冒号前面的x ...
- 八. Python基础(8)--函数
八. Python基础(8)--函数 1 ● 函数返回布尔值 注意, 自定义的函数也可以是用来作逻辑判断的, 例如内置的startswith()等函数. def check_len(x): ' ...
- python基础之函数详解
Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...
- python学习笔记三 深浅copy,扩展数据类型(基础篇)
深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...
随机推荐
- Java GC 日志详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt105 java GC日志可以通过 +PrintGCDetails开启 以Pa ...
- Spring Cloud中负载均衡器概览
在上篇文章中(RestTemplate的逆袭之路,从发送请求到负载均衡)我们完整的分析了RestTemplate的工作过程,在分析的过程中,我们遇到过一个ILoadBalancer接口,这个接口中有一 ...
- Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)
说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...
- Javascript学习日志(三):闭包
说实话,前面一节的原型和原型链在当初学的时候并没有很头疼,对着高级编程第三版撸了几遍就理解透了,闭包这一节真的挺头疼的,很惭愧,看了差不多十来遍吧,还翻看了网上的其他博客和解释文档,五花八门的表达方式 ...
- JOptionPane弹框常用实例
最近在做swing程序中遇到使用消息提示框的,JOptionPane类其中封装了很多的方法. 很方便的,于是就简单的整理了一下. 1.1 showMessageDialog 显示一个带有OK 按钮的模 ...
- Linux cat /proc/meminfo 输出分析
$cat /proc/meminfoMemTotal: 2052440 kB //总内存MemFree: 50004 kB //空闲内存Buffers: ...
- 201521123034《Java程序设计》第八周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1) 1.1 实验总结 答:这题是在课堂上 ...
- 201521123122 《java程序设计》 第四周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 这个思维导图比较简单,详细内容点击此处 2. 书面作业 注释的应用 使用类的注释与方法的注释 ...
- 201521123115《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- python之进程----Queue
一.Queue是通过multiprocessing使用 from multiprocessing import Process,Queue import time import random impo ...