Python基础之set与函数

时间:2024-07-26 22:06:38

set集合

set 是无序,不重复的序列,基本功能包括去重和关系测试,集合中没有插入的方法,只能添加。

集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等

1.交集

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 set_1 = set([0,1,2,3,4,5,])

 set_2 = set([2,3,4,5,6,7])

 # 交集,set_1中存在并且set_2中也存在的
 print(set_1.intersection(set_2))

执行上代码结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/set1.py
{2, 3, 4, 5}

2.并集

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 set_1 = set([0,1,2,3,4,5,])

 set_2 = set([2,3,4,5,6,7])

 # 并集,合并两个集合中的内容并删除相同的元素
 print(set_1.union(set_2))

执行上代码结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/set1.py
{0, 1, 2, 3, 4, 5, 6, 7}

3.差集

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 set_1 = set([0,1,2,3,4,5,])

 set_2 = set([2,3,4,5,6,7])

 # 差集,set_1中有的set_2中没有的
 print(set_1.difference(set_2))

执行上代码结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/set1.py
{0, 1}

4.子集

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 set_1 = set([2,3,4,5,])

 set_2 = set([2,3,4,5,6,7])

 # 子集,set_1中的内容时候在set_2中,返回True或False
 print(set_1.issubset(set_2))

执行上代码结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/set1.py
True

5.父集

  1 #!/usr/bin/env python
  2 # _*_ coding:utf-8 _*_
  3 # Author: enzhi.wang
  4 set_1 = set([2,3,4,5,])
  5
  6 set_2 = set([2,3,4,5,6,7])
  7
  8 # 父集
  9 print(set_1.issuperset(set_2))   #set_1是否是set_2的父集  
 10 print(set_2.issuperset(set_1))  #set_2是否是set_1的父集
  执行上代码结果为:

 C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/set1.py
 False
 True

6.对称差集

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 set_1 = set([0,1,2,3,4,5,])

 set_2 = set([2,3,4,5,6,7])

 # 对称差集,返回两个集合中有差集的元素
 print(set_1.symmetric_difference(set_2))

 执行上面代码的结果为:
 C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/set1.py
 {0, 1, 6, 7}

7.判断是否有交集

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 set_1 = set([0,1,2,3,4,5,])

 set_2 = set([2,3,4,5,6,7])

 # 判断是否有交集,有返回False
 print(set_1.isdisjoint(set_2))

 执行上面代码的结果为:
 C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/set1.py
 False

8.set的其它操作

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 set_1 = set([0,1,2,3,4,5,])

 set_2 = set([2,3,4,5,6,7])

 #  添加1项
 set_1.add(999)
 print(set_1)

 # 添加多个
 set_1.update([111,222,333,])
 print(set_1)
 #
 # 删除
 set_1.remove(999)
 print(set_1)

 # 随机删除并返回删除的值
 print(set_1.pop())

 # 删除不存在不报错
 set_1.discard('ddd')

 # 成员测试
 if 1 in set_1:
     print('True')
 else:
     print('False')

执行上面代码的结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/set1.py
{0, 1, 2, 3, 4, 5, 999}
{0, 1, 2, 3, 4, 5, 999, 333, 111, 222}
{0, 1, 2, 3, 4, 5, 333, 111, 222}
0
True

9.集合的运算符

上面各示例中都是使用英文关键词去操作的集合,集合还支持使用&,^,|,-,符号进行操作。

 # 集合运算符

 # 交集
 运算符 &

 # 差集
 运算符 -

 # 并集
 运算符 |

 # 对称差集
 运算符 ^

函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

语法

python定义函数使用def关键字,一般格式如下:

def  函数名(参数列表):
    "函数声明"
     函数体

示例1:用函数来输入Hello World

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 def hello():
     print("Hello,World!!")

 # 调用函数使用函数名加()括号即可
 hello()

执行上面代码的结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/练习/func_helloworld.py
Hello,World!!

更复杂的应用函数中带上参数变量;

参数

以下是调用函数时可使用的正式参数类型:

  • 必需参数
  • 关键字参数
  • 默认参数
  • 不定长参数

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 def test1(x,y):     #形式参数
     print("x的值为:",x)
     print("y的值为:",y)

 test1(1,2) #位置传参要与x,y一一对应

 test1(y=1,x=2)  #指定参数,与形式参数顺序无关

执行上面代码的结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/func_test2.py
x的值为: 1
y的值为: 2
x的值为: 2
y的值为: 1

下面实例为不传入参数时的情况:

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 def test1(x,y):     #形式参数
     print("x的值为:",x)
     print("y的值为:",y)

 test1()

执行上面代码的结果为:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/func_test2.py
Traceback (most recent call last):
  File "C:/Users/root/PycharmProjects/S14/day3/func_test2.py", line 12, in <module>
    test1()
TypeError: test1() missing 2 required positional arguments: 'x' and 'y'

关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

以下实例在函数 test1()调用时使用参数名:

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 def test1(str):     #形式参数
     "传入任何字符串"
     print(str)

 test1(str="你好,世界!")

以上实例输出结果:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/func_test2.py
你好,世界!

以下实例中演示了函数参数的使用不需要使用指定顺序:

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 # Author: enzhi.wang
 def test1(name,age,job):     #形式参数
     "传入任何字符串"
     print("姓名:",name)
     print("年龄:",age)
     print("工作:",job)

 test1(age=20,job="运维",name="王恩志")

以上实例输出结果:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/func_test2.py
姓名: 王恩志
年龄: 20
工作: 运维

默认参数

调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
def test1(name,job,age = 20):     #注意:默认参数必须放置在没有指定默认参数的关键字参数后面否则报错
    "传入任何字符串"
    print("姓名:",name)
    print("年龄:",age)
    print("工作:",job)
test1(job="运维",name="王恩志")

以上实例输出结果:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/func_test2.py
姓名: 王恩志
年龄: 20
工作: 运维

不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
def 函数名(*args):
     函数体
    return

加了星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组。如下实例:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
def test(*args):
    print("多个参数:",args)

test()
test(1,2,3,4,5,6)

以上实例输出结果:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/func_test3.py
多个参数: ()
多个参数: (1, 2, 3, 4, 5, 6)

加了两个星号(**)时传入的参数必须是以key-value的形式。如果在函数调用时没有指定参数,它就是一个空字典。如下实例:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang

def test(**kwargs):
    print(kwargs)
    print(kwargs['name'])
    print(kwargs['age'])
    print(kwargs['job'])

# 调用test()函数,传入的值为key-value的形式
test(name="王恩志",age=18,job="运维")

以上实例输出结果:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/func_test4.py
{'name': '王恩志', 'age': 18, 'job': '运维'}
王恩志
18
运维

return语句

return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值,以下实例演示了 return 语句的用法:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
def test(arg1,arg2):
    total = arg1 + arg2
    print("函数内total为:",total)
    return total

result = test(10,20)  #result用于接收函数的返回值
print("函数外返回的值为:",result)

以上实例输出结果:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/func_test7.py
函数内total为: 30
函数外返回的值为: 30

变量作用域

Pyhton 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。两种最基本的变量作用域如下:

  • 全局变量
  • 局部变量

全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# Author: enzhi.wang
total = 0   #这是一个全局变量

def test(arg1,arg2):
    "local variable"
    total = arg1 + arg2 #这里是局部变量
    print("函数内是局部变量",total)
    return total

# 调用test函数
test(10,20)
print("函数外是全局变量",total)

以上实例输出结果:

C:\Python3.5\python.exe C:/Users/root/PycharmProjects/S14/day3/func_test8.py
函数内是局部变量 30
函数外是全局变量 0

内置函数

1. enumerate()

在python中循环一个列表或者元祖时要想打印索引又同时打印元素时通常是这样去写

 #!/usr/bin/env python
 # -*-coding: utf-8 -*-
 # Author: enzhi.wang
5 li = ['iPhone6s','Macbook Pro','Mp3',]6 for i in range(len(li)):7     print(i,li[i])

以上实例输出结果:

C:\python3\python.exe C:/Users/Administrator/PycharmProjects/S14-python3/day4/lambda_func.py
0 iPhone6s
1 Macbook Pro
2 Mp3

上面的写法需要先获取列表中有几个元素使用len()函数,然后在循环打印,使用enumerate就可以简化上面的写法

 #!/usr/bin/env python
 # -*-coding: utf-8 -*-
 # Author: enzhi.wang
 #

 li = ['iPhone6s','Macbook Pro','Mp3',]
 for i,item in enumerate(li,1):  #enumerate(li,1) 这里1的作用是打印时前面的序号从1开始
     print(i,item)

以上实例输出结果:

C:\python3\python.exe C:/Users/Administrator/PycharmProjects/S14-python3/day4/lambda_func.py
1 iPhone6s
2 Macbook Pro
3 Mp3

2. eval()

eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。

示例

 #!/usr/bin/env python
 # -*-coding: utf-8 -*-
 # Author: enzhi.wang
 a = "1 + 1"
 print(a)
 print(eval(a))  #eval()会将a变量值中的字符串当做表达式来进行求值并返回结果,所以会返回1+1的结果是2

以上实例输出结果:

C:\python3\python.exe C:/Users/Administrator/PycharmProjects/S14-python3/day4/practice_eval.py
1 + 1
2