函数及组合数据类型

函数的定义与使用

1、概述

  • 函数的理解与定义
  • 函数的使用与调用过程
  • 函数的参数传递
  • 函数的返回值
  • 局部变量和全局变量

2、函数的理解与定义

# 圆周率函数调用
def pi ():
    import random
    a = 0
    for i in range(10000):
        x, y = random.random(), random.random()
        b = pow(x ** 2 + y ** 2, 0.5)
        if b <= 1:
            a += 1
    print(4 * a / 10000)
pi()
# 带参数的圆周率函数调用
def pi(num):
    import random
    a = 0
    for i in range(num):
        x, y = random.random(), random.random()
        b = pow(x ** 2 + y ** 2, 0.5)
        if b <= 1:
            a += 1
    print(4*a/num)
pi(100)
pi(1000)
pi(10000)
pi(100000)
# 圆周率函数调用返回值
def pi(num):
    import random
    a = 0
    for i in range(num):
        x, y = random.random(), random.random()
        b = pow(x ** 2 + y ** 2, 0.5)
        if b <= 1:
            a += 1
    return 4*a/num
a = pi(1000)
print(a)

2.1、函数的定义

函数是一段代码的表示

  • 函数是一段具有特定功能的、可重用的语句组
  • 函数是一种功能的抽象,一般函数表达特定功能
  • 两个作用:降低编程难度和代码复用
def <函数名>(<参数(0个或多个)>) :
    <函数体>
    return <返回值>
  • 函数定义时,所指定的参数是一种占位符
  • 函数定义后,如果不经过调用,不会被执行
  • 函数定义时,参数时输入、函数体是处理、结果是输出(Ipo)

3、函数的使用及调用过程

3.1、函数的调用

调用是运行函数代码的方式

def fact(n):  # 函数的定义
    s = 1
    for i in range(1,n+1):
        s *= i
    return s
fact(10)  # 函数的调用
  • 调用时要给出实际参数
  • 实际参数替换定义中的参数
  • 函数调用后得到返回值

4、函数的参数传递

函数可以有参数,也可以没有,但是必须保留括号

def <函数名>(<非可选参数>,<可选参数>) :
    <函数体>
    return <返回值>

5、函数的返回值

函数可以返回0个或多个结果

  • return保留字用来传递返回值
  • 函数可以有返回值,也可以没有,可以有return,也可以没有
  • return 可以传递0个返回值,也可以传递任意多个返回值

组合数据类型

集合类型及操作

1、概述

  • 集合类型定义
  • 集合操作符
  • 集合处理方法
  • 集合类型应用场景

2、集合类型定义

集合是多个元素的无序组合

  • 集合类型与数学中的集合概念一致
  • 集合元素之间无序,每个元素唯一,不存在相同元素
  • 集合元素不可更改,不能是可变数据类型
  • 集合用大括号{}表示,元素间用逗号分隔
  • 建立集合类型用{}或set{}
  • 建立空集合类型,必须使用set{}
A = {"python", 123, ("python", 123)}  # 使用{}建立集合
A

{('python', 123), 123, 'python'}

B = set("pypy123")  # 使用set()建立集合
B

{'1', '2', '3', 'p', 'y'}

C = {"python", 123, "python", 123}
C

{123, 'python'}

3、集合操作符

3.1集合6个操作符

操作符及应用 描述
S | T 返回一个新集合,包括在集合S和T中的所有元素
S - T 返回一个新集合,包括在集合S但不在T中的元素
S & T 返回一个新集合,包括同时在集合S和T中的元素
S ^ T 返回一个新集合,包括集合S和T中的非相同元素
S <= T或S < T 返回True/False,判断S和T的子集关系
S >= T或S > T 返回True/False,判断S和T的包含关系
A = {"p", "y", 123}
B = set("pypy123")
A - B

{123}

A & B

{'p', 'y'}

A ^ B

{'1', 123, '2', '3'}

B - A

{'1', '2', '3'}

A | B

{'1', 123, '2', '3', 'p', 'y'}

4、集合处理方法

操作函数或方法 描述
S.add(x) 如果x不在集合S中,将x增加到S
S.discard(x) 移除S中元素x,如果x不在集合S中,不报错
S.remove(x) 移除S中元素x,如果x不在集合S中,产生KeyError异常
S.clear() 移除S中所有元素
S.pop() 随机返回S的一个元素,更新S,若S为空产生KeyError异常
S.copy() 返回集合S的一个副本
len(S) 返回集合S的元素个数
x in S 判断S中元素x,x在集合S中,返回True,否则返回False
x not in S 判断S中元素x,x不在集合S中,返回False,否则返回True
set(x) 将其他类型变量x转变为集合类型

列表类型

列表类型及操作

1、列表类型定义

列表是序列类型的一种扩展

  • 列表是一种序列类型,创建后可以随意被修改
  • 使用方括号[]或list()创建,元素间用逗号,分隔
  • 列表中各元素类型可以不同,无长度限制

2、列表类型操作函数和方法

函数或方法 描述
ls.append(x) 在列表ls最后增加一个元素x
ls.clear() 删除列表ls中所有元素
ls.copy() 生成一个新列表,赋值ls中所有元素
ls.insert(i,x) 在列表ls的第i位置增加元素x
ls.pop(i) 将列表ls中第i位置元素取出并删除该元素
ls.remove(x) 将列表ls中出现的第一个元素x删除
ls.reverse() 将列表ls中的元素反转
ls = ["cat", "dog", "tiger", 1024]
ls.append(1234)
ls

['cat', 'dog', 'tiger', 1024, 1234]

ls.insert(3, "human")
ls

['cat', 'dog', 'tiger', 'human', 1024, 1234]

ls.reverse()
ls

[1234, 1024, 'human', 'tiger', 'dog', 'cat']

字典类型及操作

1、概述

  • 字典类型定义
  • 字典处理函数及方法
  • 字典类型应用场景

2、字典类型定义

2.1、字典类型定义

字典类型是“映射”的体现

  • 键值对:键值是数据索引的扩展
  • 字典是键值对的集合,键值对之间无序
  • 采用大括号{}和dict()创建,键值对用冒号:表示

{<键1>:<值1>, <键2>:<值2>, … , <键n>:<值n>}

2.2、字典类型的用法

在字典变量中,通过键获得值

<字典变量> = {<键1>:<值1>, … , <键n>:<值n>}

<值> = <字典变量>[<键>]

<字典变量>[<键>] = <值>

[ ]用来向字典变量中索引或增加元素

2.3、字典类型定义和使用

d = {"中国": "北京", "美国": "华盛顿", "法国": "巴黎"}
d

{'中国': '北京', '美国': '华盛顿', '法国': '巴黎'}

d['中国']

'北京'

de = {}
type(de)

dict

字典处理函数及方法

函数或方法 描述
del d[k] 删除字典d中键k对应的数据值
k in d 判断键k是否在字典d中,如果在返回True,否则False
d.keys() 返回字典d中所有的键信息
d.values() 返回字典d中所有的值信息
d.items() 返回字典d中所有的键值对信息

3.1字典类型操作

d = {"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
"中国" in d 

True

d.keys()

dict_keys(['中国', '美国', '法国'])

d.values()

dict_values(['北京', '华盛顿', '巴黎'])

3.2 字典类型操作函数和方法

函数或方法 描述
d.get(k, ) 键k存在,则返回相应值,不在则返回值
d.pop(k, ) 键k存在,则取出相应值,不在则返回值
d.popitem() 随机从字典d中取出一个键值对,以元组形式返回
d.clear() 删除所有的键值对
len(d) 返回字典d中元素的个数
d = {"中国":"北京", "美国":"华盛顿", "法国":"巴黎"}
d.get("中国","伊斯兰堡")

'北京'

d.get("巴基斯坦","伊斯兰堡")

'伊斯兰堡'

d.popitem()

('法国', '巴黎')

jieba库的使用

1、jieba库基本介绍

1.1、jieba库概述

jieba是优秀的中文分词第三方库

  • 中文文本需要通过分词获得单个的词语
  • jieba是优秀的中文分词第三方库,需要额外安装
  • jieba库提供三种分词模式,最简单只需掌握一个函数

1.2、jieba分词的原理

jieba分词依靠中文词库

  • 利用一个中文词库,确定汉字之间的关联概率
  • 汉字间概率大的组成词组,形成分词结果
  • 除了分词,用户还可以添加自定义的词组

2、jieba库使用说明

2.1、jieba库常用函数

函数 描述
jieba.lcut(s) 精确模式,返回一个列表类型的分词结果
jieba.lcut(s, cut_all=True) 全模式,返回一个列表类型的分词结果,存在冗余
jieba.lcut_for_search(s) 搜索引擎模式,返回一个列表类型的分词结果,存在冗余
jieba.add_word(w) 向分词词典增加新词w
import jieba

jieba.lcut("中国是一个伟大的国家")

['中国', '是', '一个', '伟大', '的', '国家']

jieba.lcut("中国是一个伟大的国家",cut_all=True)

['中国', '国是', '一个', '伟大', '的', '国家']

jieba.lcut("中华人民共和国是伟大的")

['中华人民共和国', '是', '伟大', '的']

jieba.lcut("中华人民共和国是伟大的",cut_all=True)

['中华', '中华人民', '中华人民共和国', '华人', '人民', '人民共和国', '共和', '共和国', '国是', '伟大', '的']

练习

name = " aleX"
# 1)移除 name 变量对应的值两边的空格,并输出处理结果
		print(name.strip())
# 2)判断 name 变量对应的值是否以 "al" 开头,并输出结果
		print(name.startswith('al'))
# 3)判断 name 变量对应的值是否以 "X" 结尾,并输出结果
		print(name.endswith('x'))
# 4)将 name 变量对应的值中的 “l” 替换为 “p”,并输出结果
		print(name.replace('l','p'))
# 5)将 name 变量对应的值根据 “l” 分割,并输出结果。
		print(name.split('l'))
# 6)将 name 变量对应的值变大写,并输出结果
		print(name.upper())
# 7)将 name 变量对应的值变小写,并输出结果
		print(name.lower())
# 8)请输出 name 变量对应的值的第 2 个字符?
		print(name[1])
# 9)请输出 name 变量对应的值的前 3 个字符?
		print(name[:3])
# 10)请输出 name 变量对应的值的后 2 个字符?
		print(name[-2:])
# 11)请输出 name 变量对应的值中 “e” 所在索引位置?
		print(name.find('e'))
# 12)获取子序列,去掉最后一个字符。如: oldboy 则获取 oldbo。
		a = 'oldboy'
		print(a[:-1])
# 1.将以下数据存储为字典类型
# 数据:info = "name:Owen|age:18|gender:男"
# 结果:{'name': 'Owen', 'age': 18, 'gender': '男'}
	info = {"name":"owen","age":"18","gender":"男"}
	print(info)

# 2.完成数据的去重
# 数据:t3 = [1, 2, 1, 2, 3, 5, 9]
# 结果:t3 = [1, 2, 3, 5, 9]
	t3 = [1, 2, 1, 2, 3, 5, 9]
	print(set(t3))

# 3 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
	
    s1 = {11,22,33,44,55,66,77,88,99,90}
	zd = {">=60":[],"<60":[]}
	for i in s1:
    	if i >= 60:
        	zd[">=60"].append(i)
    	else:
        	zd["<60"].append(i)
	print(zd)


# 4.完成录入电话本(选做)
# 需求:
'''
-- 从键盘中录入姓名(不区分大小写):
	-- 姓名必须是全英文字母组成,不是则重新录入姓名,如果是q,代表退出
-- 从键盘中再录入电话:
	-- 电话必须为字符串中是数字(如'12312312312')且长度必须是11位
-- 如果出现姓名相同,则保留最后一次电话号码
-- 形成的数据是有电话分组的,如:第一次录入Owen,13355667788,则会形成
	-- {
    	'O': {
    		'Owen': '13355667788'
    	}
	}
	
最终数据,分组名一定大写:
{
    'E': {
		'egon': '17788990000',
		'engo': '16633445566'
    },
    'O': {
    	'Owen': '13355667788'
    }
}
'''

record ={}
while True:
    information = {}
    name = input("请输入姓名:")
    if name.isalpha() == False:
        continue
    elif name == 'q':
        break
    while True:
        number = input("请输入电话号码:")
        if number.isdigit() == False or len(number) != 11:
            continue
        else:
            information[name]= number
            break
    if not name[0].upper() in record:
        record.setdefault(name[0].upper(),information)
    else:
        record[name[0].upper()].setdefault(name,number)
print(record)

posted @ 2019-07-18 19:43  lvxiwei  阅读(370)  评论(0)    收藏  举报