python初识(三)

目录:

  • 字符编码
  • 文件操作
  • 循环结构拾遗
  • 函数
    • 整体介绍
    • 函数的参数
    • 函数的返回值
    • 函数的调用
    • 自定义函数

一、字符编码

1、了解字符编码的知识储备

  a. 文件编辑存取文件的原理(nodepad++,pycharm,word)

    启动进程---〉打开文件---〉读取内容到内存(断电会丢失)---〉保存(flush刷入硬盘)

  b. python解释器执行原理。

   python解释器启动---〉进程打开.py文件---〉读取文件到内存----〉执行

  ps. 两者区别,在于python解释器可以执行

2、什么是字符编码

  a. 众所周知,计算机通电工作,且只是通过高低电平(二进制,高为1,低为2)工作的。

b. 这就意味着计算机制认识数字,而人类的语言经过翻译转换成数字,驱使计算机干活这件事为编程。所以人类的语言经过翻译转换成数字,转化中的语言与数字的对应关系,我们称为字符编码。

字符 ----〉字符编码表(翻译过程)---〉数字

3、unicode和utf-8(字符编码)

  uncicode:简单粗暴,所有字符最少2bytes,优点为字符--〉数字的转换速度快,缺点为占用空间大。(内存中使用)

uft-8:精准,可变字符长度,优点节省空间,缺点转换过程慢,因为需要计算当前字符的长度。(硬盘中使用)

4、字符编码的使用:

a. 读取和保存过程图

b.无论使用何种编辑器,要防止乱码,核心法则为,文件以什么编码保存,就应以什么编码方式打开。

5、python程序的执行过程。

  a. python解释器启动---〉进程打开.py文件---〉读取文件到内存----〉执行

  b. 执行步骤细节:

1 # 加载到内存,所占用的内存为unicode编码二进制
2 print(‘====>‘)
3 x = ‘shuyang‘ #结果shuyang, 临时申请内存,unicode编码二进制,程序结束释放
4 y = x.encode(‘utf-8‘) #结果b‘shuyang‘,临时申请内存,unicode编码二进制,程序结束释放

c.python2与python3的区别:

    • 在python2中,str就是编码后的结果bytes,str=bytes,所以在python2中,unicode字符编码的结果是str/bytes
    • 在python2解释器执行到产生字符串的代码时(例如s=u‘林‘),会申请新的内存地址,然后将‘林‘以unicode的格式存放到新的内存空间中,所以s只能encode,不能decode
    • python3中的字符串与python2中的u‘字符串‘,都是unicode,所以无论如何打印都不会乱码
    • 示例:

python2.7

 1 python2.7
 2 #coding:utf-8
 3 s=u‘林‘ #当程序执行时,‘林‘会被以unicode形式保存新的内存空间中
 4
 5 # s指向的是unicode,因而可以编码成任意格式,都不会报encode错误
 6 # 因为系统默认字符集,输出显示为GBK,pycharm为UTF-8
 7 s1=s.encode(‘utf-8‘)
 8 s2=s.encode(‘gbk‘)
 9 print s1 #控制台打印乱码,pycharm正常
10 print s2 #控制台正常,pycharm乱码
11
12
13 print repr(s) #u‘\u6797‘
14 print repr(s1) #‘\xe6\x9e\x97‘ 编码一个汉字utf-8用3Bytes
15 print repr(s2) #‘\xc1\xd6‘ 编码一个汉字gbk用2Bytes
16
17 print type(s) #<type ‘unicode‘>
18 print type(s1) #<type ‘str‘>
19 print type(s2) #<type ‘str‘>
20 ‘‘‘

  python3.0(str -->unicode, bytes--->bytes)

1 #coding:utf-8
2 s=‘林‘ #当程序执行时,无需加u,‘林‘也会被以unicode形式保存新的内存空间中,
3
4 #s可以直接encode成任意编码格式
5 s.encode(‘utf-8‘)
6 s.encode(‘gbk‘)
7
8 print(type(s)) #<class ‘str‘>

 1 #coding:utf-8
 2 s=‘林‘ #当程序执行时,无需加u,‘林‘也会被以unicode形式保存新的内存空间中,
 3
 4 #s可以直接encode成任意编码格式
 5 s1=s.encode(‘utf-8‘)
 6 s2=s.encode(‘gbk‘)
 7
 8
 9
10 print(s) #林
11 print(s1) #b‘\xe6\x9e\x97‘ 在python3中,是什么就打印什么
12 print(s2) #b‘\xc1\xd6‘ 同上
13
14 print(type(s)) #<class ‘str‘>
15 print(type(s1)) #<class ‘bytes‘>
16 print(type(s2)) #<class ‘bytes‘>

二、文件操作

1、文件处理流程

a.打开文件---〉获取文件对象---〉关闭文件

b.read.txt内容

 1 演员 - 薛之谦
 2 词:薛之谦
 3 曲:薛之谦
 4 简单点说话的方式简单点
 5 递进的情绪请省略
 6 你又不是个演员
 7 别设计那些情节
 8 没意见我只想看看你怎么圆
 9 你难过的太表面 像没天赋的演员
10 观众一眼能看见
11 该配合你演出的我演视而不见
12 在逼一个最爱你的人即兴表演
13 什么时候我们开始收起了底线
14 顺应时代的改变看那些拙劣的表演
15 可你曾经那么爱我干嘛演出细节
16 我该变成什么样子才能延缓厌倦
17 原来当爱放下防备后的这些那些
18 才是考验
19 没意见你想怎样我都随便
20 你演技也有限
21 又不用说感言
22 分开就平淡些
23 该配合你演出的我演视而不见
24 别逼一个最爱你的人即兴表演
25 什么时候我们开始没有了底线
26 顺着别人的谎言被动就不显得可怜
27 可你曾经那么爱我干嘛演出细节
28 我该变成什么样子才能配合出演
29 原来当爱放下防备后的这些那些
30 都有个期限
31 其实台下的观众就我一个
32 其实我也看出你有点不舍
33 场景也习惯我们来回拉扯
34 还计较着什么
35 其实说分不开的也不见得
36 其实感情最怕的就是拖着
37 越演到重场戏越哭不出了
38 是否还值得
39 该配合你演出的我尽力在表演
40 像情感节目里的嘉宾任人挑选
41 如果还能看出我有爱你的那面
42 请剪掉那些情节让我看上去体面
43 可你曾经那么爱我干嘛演出细节
44 不在意的样子是我最后的表演
45 是因为爱你我才选择表演 这种成全

2、基本操作

  f = open(‘<路径+文件名>‘,‘<模式>‘...) # 默认为r模式只读(read)

  first_line = f.read_line() # 读取第一行

  print(first_line)

  f.close() # 关闭文件

1 ‘‘‘
2 1、基本操作
3 ‘‘‘
4 f = open(‘read.txt‘, encoding=‘utf-8‘) # 默认为r模式只读(read)
5 first_line = f.readline() # 读取第一行
6 print(first_line)
7 f.close() # 关闭文件

3、文件打开模式

打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件对象对该文件操作。

a. 打开文件的模式有:

      • r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
      • w,只写模式【不可读;不存在则创建;存在则清空内容】
      • x, 只写模式【不可读;不存在则创建,存在则报错】
      • a, 追加模式【可读;   不存在则创建;存在则只再末尾追加内容】

b. "+" 表示可以同时读写某个文件

      • r+, 读写【可读,可写】
      • w+,写读【可写,可读】
      • x+ ,写读【可读,可写】
      • a+, 写读【可读,可写】

c. "b"表示以字节的方式操作,需要decode解码,encode编码,二进制可编辑图片,音频等等

      • rb  或 r+b
      • wb 或 w+b
      • xb 或 w+b
      • ab 或 a+b

ps.以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

4、文件内置函数

 1 ‘‘‘
 2 2、文件的内置函数
 3 ‘‘‘
 4 # 按行读取
 5 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 6 # a = f.readline()  # 按行读取
 7 # print(a)
 8 # f.close()
 9
10 # 按行全部读取为list
11 # f = open(‘read.txt‘, encoding=‘utf-8‘)
12 # a = f.readlines()  # 按行全部读取为list
13 # print(a)
14 # f.close()  # 关闭
15
16 # 默认全部读取,读取指定字符数据
17 # f = open(‘read.txt‘, encoding=‘utf-8‘)
18 # a = f.read()  # 默认全部读取,读取指定字符数据
19 # print(a)
20 # f.close()  # 关闭
21
22 # 返回一个长整型的"文件标签"
23 # f = open(‘read.txt‘, encoding=‘utf-8‘)
24 # a = f.fileno()  # 返回一个长整型的"文件标签"
25 # print(a)
26 # f.close()
27
28 # 返回文件名
29 # f = open(‘read.txt‘, encoding=‘utf-8‘)
30 # a = f.name  # 返回文件名
31 # print(a)
32 # f.close()
33
34 # 返回文件编码
35 # f = open(‘read.txt‘, encoding=‘utf-8‘)
36 # a = f.encoding  # 返回文件编码
37 # print(a)
38 # f.close()
39
40 # 强制刷新写入硬盘,不建议频繁使用
41 # f = open(‘read.txt‘, encoding=‘utf-8‘)
42 # a = f.flush()  # 强制刷新写入硬盘,不建议频繁使用
43 # print(a)
44 # f.close()
45
46 # 判断文件是否是同意tty设备
47 # f = open(‘read.txt‘, encoding=‘utf-8‘)
48 # a = f.isatty()  # 判断文件是否是同意tty设备
49 # print(a)
50 # f.close()
51
52 # 判断文件是否可读
53 # f = open(‘read.txt‘, encoding=‘utf-8‘)
54 # a = f.readable()  # 判断文件是否可读
55 # print(a)
56 # f.close()
57
58 # 指定文件中指针位置
59 # f = open(‘read.txt‘, encoding=‘utf-8‘)
60 # a = f.seek(0)  # 指定文件中指针位置 0为文件开始,以字节为单位
61 # print(a)
62 # f.close()
63
64 # 指针是否可操作
65 # f = open(‘read.txt‘, encoding=‘utf-8‘)
66 # a = f.seekable()  # 指针是否可操作
67 # print(a)
68 # f.close()
69
70 # 获取指针位置,以字节为单位
71 # f = open(‘read.txt‘, encoding=‘utf-8‘)
72 # a = f.tell()  # 获取指针位置,以字节为单位
73 # print(a)
74 # f.close()
75
76 # 截断数据,仅保留指定之前数据,以字节为单位
77 # f = open(‘read.txt‘, encoding=‘utf-8‘)
78 # a = f.truncate(4)  # 截断数据,仅保留指定之前数据,以字节为单位
79 # print(a)
80 # f.close()
81
82 # 判断文件是否可写
83 # f = open(‘read.txt‘,‘w‘, encoding=‘utf-8‘)
84 # a = f.writable()  # 判断文件是否可写
85 # print(a)
86 # f.close()
87
88 # 清空文件后,写入内容
89 # f = open(‘read.txt‘,‘w‘, encoding=‘utf-8‘)
90 # f.write()  # 清空文件后,写入内容
91 # f.close()
92
93 # 清空文件后,写入多个内容list,dict
94 # f = open(‘read.txt‘,‘w‘, encoding=‘utf-8‘)
95 # f.writelines([‘a‘,‘b‘,‘c‘])  # 清空文件后,写入多个内容list,dict
96 # f.close()

  ps. read(3)代表读取3个字符,其余的文件内光标移动都是以字节为单位如seek,tell,read,truncate

5、文件操作语法

  a.open()语法

open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
open函数有很多的参数,常用的是file,mode和encoding
file:文件位置,需要加引号
mode:文件打开模式
buffering:的可取值有0,1,>1三个,0代表buffer关闭(只适用于二进制模式),1代表line buffer(只适用于文本模式),>1表示初始化的buffer大小;
encoding:表示的是返回的数据采用何种编码,一般采用utf8或者gbk;
errors:的取值一般有strict,ignore,当取strict的时候,字符编码出现问题的时候,会报错,当取ignore的时候,编码出现问题,程序会忽略而过,继续执行下面的程序。
newline:可以取的值有None, \n, \r, ”, ‘\r\n‘,用于区分换行符,但是这个参数只对文本模式有效;
closefd:的取值,是与传入的文件参数有关,默认情况下为True,传入的file参数为文件的文件名,取值为False的时候,file只能是文件描述符,什么是文件描述符,就是一个非负整数,在Unix内核的系统中,打开一个文件,便会返回一个文件描述符。

b.python2中file() 与open() 的区别

两者都能够打开文件,对文件进行操作,也具有相似的用法和参数,但是,这两种文件打开方式有本质的区别,file为文件类,用file()来打开文件,相当于这是在构造文件类,而用open()打开文件,是用python的内建函数来操作,建议使用open

6、上下文管理 

  1 ‘‘‘
  2 2、文件的内置函数
  3 ‘‘‘
  4 # 按行读取
  5 # f = open(‘read.txt‘, encoding=‘utf-8‘)
  6 # a = f.readline()  # 按行读取
  7 # print(a)
  8 # f.close()
  9
 10 # 按行全部读取为list
 11 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 12 # a = f.readlines()  # 按行全部读取为list
 13 # print(a)
 14 # f.close()  # 关闭
 15
 16 # 默认全部读取,读取指定字符数据
 17 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 18 # a = f.read()  # 默认全部读取,读取指定字符数据
 19 # print(a)
 20 # f.close()  # 关闭
 21
 22 # 返回一个长整型的"文件标签"
 23 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 24 # a = f.fileno()  # 返回一个长整型的"文件标签"
 25 # print(a)
 26 # f.close()
 27
 28 # 返回文件名
 29 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 30 # a = f.name  # 返回文件名
 31 # print(a)
 32 # f.close()
 33
 34 # 返回文件编码
 35 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 36 # a = f.encoding  # 返回文件编码
 37 # print(a)
 38 # f.close()
 39
 40 # 强制刷新写入硬盘,不建议频繁使用
 41 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 42 # a = f.flush()  # 强制刷新写入硬盘,不建议频繁使用
 43 # print(a)
 44 # f.close()
 45
 46 # 判断文件是否是同意tty设备
 47 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 48 # a = f.isatty()  # 判断文件是否是同意tty设备
 49 # print(a)
 50 # f.close()
 51
 52 # 判断文件是否可读
 53 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 54 # a = f.readable()  # 判断文件是否可读
 55 # print(a)
 56 # f.close()
 57
 58 # 指定文件中指针位置
 59 # seek()的三种模式:
 60 # (1)f.seek(p,0)  移动当文件第p个字节处,绝对位置
 61 # (2)f.seek(p,1)  移动到相对于当前位置之后的p个字节
 62 # (3)f.seek(p,2)  移动到相对文章尾之后的p个字节
 63 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 64 # a = f.seek(0)  # 指定文件中指针位置 0为文件开始,以字节为单位
 65 # print(a)
 66 # f.close()
 67
 68 # 指针是否可操作
 69 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 70 # a = f.seekable()  # 指针是否可操作
 71 # print(a)
 72 # f.close()
 73
 74 # 获取指针位置,以字节为单位
 75 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 76 # a = f.tell()  # 获取指针位置,以字节为单位
 77 # print(a)
 78 # f.close()
 79
 80 # 截断数据,仅保留指定之前数据,以字节为单位
 81 # f = open(‘read.txt‘, encoding=‘utf-8‘)
 82 # a = f.truncate(4)  # 截断数据,仅保留指定之前数据,以字节为单位
 83 # print(a)
 84 # f.close()
 85
 86 # 判断文件是否可写
 87 # f = open(‘read.txt‘,‘w‘, encoding=‘utf-8‘)
 88 # a = f.writable()  # 判断文件是否可写
 89 # print(a)
 90 # f.close()
 91
 92 # 清空文件后,写入内容
 93 # f = open(‘read.txt‘,‘w‘, encoding=‘utf-8‘)
 94 # f.write()  # 清空文件后,写入内容
 95 # f.close()
 96
 97 # 清空文件后,写入多个内容list,dict
 98 # f = open(‘read.txt‘,‘w‘, encoding=‘utf-8‘)
 99 # f.writelines([‘a‘,‘b‘,‘c‘])  # 清空文件后,写入多个内容list,dict
100 # f.close()

7、文件的修改

 1 ‘‘‘
 2 4、 文件修改
 3 ‘‘‘
 4 import os
 5 with open(‘read.txt‘, ‘r‘, encoding=‘utf-8‘) as f,  6     open(‘write.txt‘, ‘w‘, encoding=‘utf-8‘) as f2:
 7     for i in f:
 8         if i.startswith(‘什么‘):
 9             i = ‘li,li,li‘
10         f2.write(i)
11
12 # os.remove(‘read.txt‘)
13 # os.rename(‘write.txt‘, ‘read.txt‘)

  8、linux下tail实现原理

1 # tail -f access.log
2 import time
3 with open(‘access.log‘,‘r‘,encoding=‘utf-8‘) as f:
4     f.seek(0,2)
5     while True:
6         line=f.readline().strip()
7         if line:
8             print(‘新增一行日志‘,line)
9         time.sleep(0.5)

三、循环结构拾遗

  循环体 ... else... 表示当循环不被break打断,就会执行else的代码

1、for...else...使用

 1 # for循环
 2 # for i in range(3):
 3 #     print(i)
 4 #     # continue
 5 #     if i == 1:
 6 #         break
 7 # else:
 8 #     print(‘=============>‘) #当for循环不被break打断,就会执行else的代码
 9
10 # 单行读取文件,写入到新文件
11 # with open(‘a.txt‘,‘r‘,encoding=‘utf-8‘) as read_f,\
12 #         open(‘aa.txt‘,‘w‘,encoding=‘utf-8‘) as write_f:
13 #
14 #     for line in read_f:
15 #         write_f.write(line)
16 #     else:
17 #         print(‘write successfull‘)

2、while...else...使用

1 # while循环
2 # i=0
3 # while i< 5:
4 #     print(i)
5 #     i+=1
6 #     if i == 3:
7 #         break
8 # else:
9 #     print(‘------>‘)

四、函数

1、整体介绍

a.数学定义的函数与python中的函数:

初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数。自变量x的取值范围叫做这个函数的定义域。例如y=2*x

python中函数定义:函数是逻辑结构化和过程化的一种编程方法。把一段程序代码,使用一种方式命名,以方便通过名字的方式调用。格式如下:

def 〈函数名〉(参数1,参数2,...):

  函数体

  <return 值>

〈函数名〉(参数1,参数2,...) # 调用模式

ps.当一个函数/过程没有使用return显示的定义返回值时,python解释器会隐式的返回None,所以在python中即便是过程也可以算作函数。

 1 def test01():
 2     msg=‘hello The little green frog‘
 3     print msg
 4
 5 def test02():
 6     msg=‘hello WuDaLang‘
 7     print msg
 8     return msg
 9
10
11 t1=test01()
12
13 t2=test02()
14
15
16 print ‘from test01 return is [%s]‘ %t1
17 print ‘from test02 return is [%s]‘ %t2

b.为何使用函数:函数是程序里没有没有缺点的应用,使用率很高

  • 函数的特点(不使用函数会怎样?)

    • 减少重复代码(无组织无结构,代码冗余)
    • 是程序变得易维护(无法统一管理且维护成本高)
    • 是程序变得易扩展(可读性差)

2、函数的分类:

  按建立类型分:内置函数,自定义函数

  a. 内置函数:系统预先设计好的函数,可以直接调用,如:sum(), max(),mix(),len()...

  b. 自定义函数

 1 #自定义函数
 2
 3 # # ******
 4 # # ******
 5 # # ******
 6 # # hello world
 7 # # ******
 8 # # ******
 9 # # ******
10 #
11 def print_star():
12     print(‘#‘*6)
13
14 def print_msg():
15     print(‘hello world‘)
16
17 print_star()
18 print_star()
19 print_star()
20 print_msg()
21 print_star()
22 print_star()
23 print_star()

3、函数的参数

  a. 从大的角度去看,函数的参数分两种:形参(变量名),实参(值)

      • 形参:形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
      • 实参:实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
      • 示例:

1 #定义阶段:x,y为形参
2 # def foo(x,y): #x=1,y=2
3 #     print(x)
4 #     print(y)
5
6 #调用阶段:1,2位实参
7 # foo(1,2) 

b.详细的区分函数的参数分为五种:位置参数,关键字参数,默认参数,可变长参数(*args,**kwargs),命名关键字参数

      • 位置参数:位置形参,必须被传值的参数。位置实参数:与形参一一对应。

1 #位置参数
2 def foo(x,y,z):#位置形参:必须被传值的参数
3     print(x,y,z)
4
5 # foo(1,2,3)
6 foo(1,2,3) #位置实参数:与形参一一对应

      • 关键字参数:key=value

1 def foo(x,y,z):
2     print(x,y,z)
3
4 foo(z=3,x=1,y=2)

         ps.关键字参数需要注意的问题:

          1)关键字实参必须在位置实参后面。如:foo(1,z=3,y=2) #正确

          2)不能重复对一个形参数传值。如:foo(x=1,2,z=3) #错误,foo(1,x=1,2,z=3) #错误

      • 默认参数

 1 def register(name,age,sex=‘male‘): #形参:默认参数
 2     print(name,age,sex)
 3
 4 register(‘asb‘,age=40)
 5 register(‘a1sb‘,39)
 6 register(‘a2sb‘,30)
 7 register(‘a3sb‘,29)
 8
 9 register(‘钢蛋‘,20,‘female‘)
10 register(‘钢蛋‘,sex=‘female‘,age=19)

ps.默认参数需要注意的问题:

1)默认参数必须跟在非默认参数后。

1 def register(sex=‘male‘,name,age): #在定义阶段就会报错
2      print(name,age,sex)

2)默认参数在定义阶段就已经赋值了,而且只在定义阶段赋值一次(了解)。

1 #(了解)二:默认参数在定义阶段就已经赋值了,而且只在定义阶段赋值一次
2 # a=100000000
3 # def foo(x,y=a):
4 #     print(x,y)
5 # a=0
6 # foo(1)
7 # 结果: x = 1 y = 100000000

3)默认参数的值通常定义成不可变类型

      • 可变长参数:*args, **kwargs
      1. *会把溢出的按位置定义的实参都接收,以元组的形式赋值给args
      2. **会把溢出的按关键字定义的实参都接收,以字典的形式赋值给kwargs
      3. 示例:

 1 # *args示例
 2 # def foo(x,y,*args): # *会把溢出的按位置定义的实参都接收,以元组的形式赋值给args
 3 #     print(x,y)
 4 #     print(args)
 5 #
 6 # foo(1,2,3,4,5)
 7
 8 # *args示例2
 9 # def add(*args):
10 #     res=0
11 #     for i in args:
12 #         res+=i
13 #     return res
14 # print(add(1,2,3,4))
15 # print(add(1,2))
16
17
18 # **kwargs示例
19 # def foo(x, y, **kwargs):  # **会把溢出的按关键字定义的实参都接收,以字典的形式赋值给kwargs
20 #     print(x, y)
21 #     print(kwargs)
22 # foo(1,2,a=1,name=‘egon‘,age=18)
23
24 # **kwargs示例2
25 # def foo(name,age,**kwargs):
26 #     print(name,age)
27 #     if ‘sex‘ in kwargs:
28 #         print(kwargs[‘sex‘])
29 #     if ‘height‘ in kwargs:
30 #         print(kwargs[‘height‘])
31 #
32 # foo(‘egon‘,18,sex=‘male‘,height=‘185‘)
33 # foo(‘egon‘,18,sex=‘male‘)

      • 命名关键字参数(了解):*后定义的参数为命名关键字参数,这类参数,必须被传值,而且必须以关键字实参的形式去传值

1 # def foo(name,age,*,sex=‘male‘,height):
2 #     print(name,age)
3 #     print(sex)
4 #     print(height)
5 # #*后定义的参数为命名关键字参数,这类参数,必须被传值,而且必须以关键字实参的形式去传值
6 # foo(‘egon‘,17,height=‘185‘)

c.综合实例应用:

      • 首先为参数的应用顺序:def foo(name,age=10,*args,sex=‘male‘,height,**kwargs): 位置参数,默认参数,*可变长参数,命名参数,关键参数,**可变长参数

ps.不建议都用,会造成相互串扰

1 # def foo(name,age=10,*args,sex=‘male‘,height,**kwargs):
2 #     print(name)
3 #     print(age)
4 #     print(args)
5 #     print(sex)
6 #     print(height)
7 #     print(kwargs)
8 #
9 # foo(‘alex‘,1,2,3,4,5,sex=‘female‘,height=‘150‘,a=1,b=2,c=3)

      • 其他实例:(*args, **kwargs)

 1 # *args参数将位置参数转化过程:转化为元祖
 2 # def foo(*args):
 3 #     print(args)
 4
 5 # foo(1,2,3,4) # 1,2,3,4 <=====>*(1,2,3,4)
 6
 7 #*[‘A‘,‘B‘,‘C‘,‘D‘],=====>‘A‘,‘B‘,‘C‘,‘D‘
 8 # foo(*[‘A‘,‘B‘,‘C‘,‘D‘]) #foo(‘A‘,‘B‘,‘C‘,‘D‘)
 9 # foo([‘A‘,‘B‘,‘C‘,‘D‘]) #
10
11 # list实参加*回传
12 # def foo(x,y,z):
13 #     print(x,y,z)
14 #
15 # # foo(*[1,2,3]) #foo(1,2,3)
16 # foo(*[1,2]) #foo(1,2)
17
18 # **kwargs将关键参数转换为字典
19 # def foo(**kwargs):
20 #     print(kwargs)
21 #
22 # #x=1,y=2  <====>**{‘y‘: 2, ‘x‘: 1}
23 # # foo(x=1,y=2)
24 #
25 # foo(**{‘y‘: 2, ‘x‘: 1,‘a‘:1}) #foo(a=1,y=2,x=1)
26
27 # dict实参加**回传
28 # def foo(x,y,z):
29 #     print(x,y,z)
30 #
31 # # foo(**{‘z‘:3,‘x‘:1,‘y‘:2}) #foo(x=1,z=3,y=2)
32 # foo(**{‘z‘:3,‘x‘:1}) #foo(x=1,z=3)
33
34 # 综合1基础
35 # def foo(x,y,z):
36 #     print(‘from foo‘,x,y,z)
37 #
38 # def wrapper(*args,**kwargs):
39 #     print(args)
40 #     print(kwargs)
41 #
42 #
43 # wrapper(1,2,3,a=1,b=2)
44
45
46 # 综合函数调用
47 # def foo(x,y,z):
48 #     print(‘from foo‘,x,y,z)
49 # def wrapper(*args,**kwargs):
50 #     print(args) #args=(1,2,3)
51 #     print(kwargs) #kwargs={‘a‘:1,‘b‘:2}
52 #     foo(*args,**kwargs) #foo(*(1,2,3),**{‘a‘:1,‘b‘:2}) #foo(1,2,3,b=2,a=1)
53 # # wrapper(1,2,3,a=1,b=2)
54 # wrapper(1,z=2,y=3)
55
56
57 # 综合函数调用 -- 错误
58 # def foo(x,y,z):
59 #     print(‘from foo‘,x,y,z)
60 # def wrapper(*args,**kwargs):
61 #     # print(args) #args=(1,)
62 #     # print(kwargs) #kwargs={‘y‘:3,‘z‘:2}
63 #     foo(*args,**kwargs) #foo(*(1,),**{‘y‘:3,‘z‘:2}) #foo(1,z=2,y=3)
64 # # wrapper(1,2,3,a=1,b=2)
65 # wrapper(1,z=2,y=3)

4、函数的返回值

  a.返回值为None

 1 # def foo():
 2 #     print(‘from foo‘)
 3 #     return None
 4 # res=foo()
 5 # print(res)
 6
 7 ‘‘‘
 8 以下三种情况返回值都为None:
 9 没有return
10 return 什么都不写
11 return None
12 ‘‘‘

    b.return 一个值 函数调用返回的结果就是这个值

1 # def foo():
2 #     print(‘from foo‘)
3 #     x=1
4 #     return x
5 # res=foo()
6 # print(res)
7
8 #return 一个值  函数调用返回的结果就是这个值

c.return 多个值

 1 # def foo():
 2 #     print(‘from foo‘)
 3 #     x=1
 4 #     return 1,[2,3],(4,5),{}
 5 # res=foo()
 6 # print(res) #打印结果:(1,[2,3],(4,5),{})
 7 # a,b,c,d=foo()
 8 # print(d)
 9
10 #return 值1,值2,值3,...   返回结果:(值1,值2,值3,...)
11
12 # t=(1,2,3)
13 # a,_,_=t # 不想要后面的值_
14 # print(a)
15
16 # t=(1,2,3,4,5,6,7,8,9)
17 # a,*_,c=t  # 不想要中心的值*_
18 # print(a)
19 # print(c)

5、函数的调用

  按照有参和无参可以将函数调用分两种:

  a. 定义时无参,调用时也无需传入参数。b. 定义时有参,调用时也必须有参数。

1 def foo():
2     print(‘from foo‘)
3
4 def bar(name):
5     print(‘bar===>‘,name)
6
7 # 按照有参和无参可以将函数调用分两种
8 foo() #定义时无参,调用时也无需传入参数
9 bar(‘egon‘) #定义时有参,调用时也必须有参数

  按照函数的调用形式和出现的位置,分三种:

  a. 调用函数的语句形式。b. 调用函数的表达式形式。c. 把函数调用当中另外一个函数的参数。

 1 #按照函数的调用形式和出现的位置,分三种
 2
 3 foo() #调用函数的语句形式
 4
 5 def my_max(x,y):
 6     res=x if x >y else y
 7     return res
 8
 9 # res=my_max(1,2)*10000000 #调用函数的表达式形式
10 # print(res)
11
12
13 res=my_max(my_max(10,20),30) #把函数调用当中另外一个函数的参数
14 print(res)

6、自定义函数

a.先定义后使用,如果没有定义而直接使用,就相当于引用了一个不存在的变量名

1 #错误
2 # foo()
3 # def foo():
4 #     print(‘from foo‘)
5 # print(foo)

b.定义函数的三种形式:无参数函数,有参函数,空函数

 1 #一:无参数函数:如果函数的功能仅仅只是执行一些操作而已,就定义成无参函数,无参函数通常都有返回值
 2 # def print_star():
 3 #     print(‘#‘*6)
 4
 5 #二:定义有参函数:函数的功能的执行依赖于外部传入的参数,有参函数通常都有返回值
 6 # def my_max(x,y):
 7 #     res=x if x >y else y
 8 #     return res
 9
10 #三:空函数:占位,定程序结构
11
12 # def auth():
13 #     """认证功能"""
14 #     pass
15 # auth()
16 # def insert():
17 #     """插入功能"""
18 #     pass
19 # def select():
20 #     """查询功能"""
21 #     pass
22 # def delete():
23 #     """删除功能"""
24 #     pass
25 # def update():
26 #     """更新功能"""
27 #     pass

ps.三元表达式

1 # x=10
2 # y=2
3 # if x > y:
4 #     print(x)
5 # else:
6 #     print(y)
7 #
8 # res=x if x > y else y
9 # print(res)

函数待续......

时间: 2024-10-23 16:10:17

python初识(三)的相关文章

[零基础学python]初识永远强大的函数

函数,对于人类来讲,能够发展到这个数学思维层次,是一个飞跃.可以说,它的提出,直接加快了现代科技和社会的发展,不论是现代的任何科技门类,乃至于经济学.政治学.社会学等,都已经普遍使用函数. 下面一段来自维基百科(在本教程中,大量的定义来自维基百科,因为它真的很百科):函数词条 [函数这个数学名词是莱布尼兹在1694年开始使用的,以描述曲线的一个相关量,如曲线的斜率或者曲线上的某一点.莱布尼兹所指的函数现在被称作可导函数,数学家之外的普通人一般接触到的函数即属此类.对于可导函数可以讨论它的极限和导

Python - 初识Python

Python - 初识Python 认识开发语言 开发语言有高级语言的低级语言之分 低级语言: c, 混编, 属于机器码,编程中底层用的 实现效率低,执行效率高,对硬件的可控性强,目标代码小,可维护性差,可移植性差 高级语言: Python, Jave, PHP, C#, go.. 属于字符码,相比机器码跟接近于自然语言,好理解. 实现效率高,执行效率低,对硬件的可控性弱,目标代码大,可维护性好,可移植性好 解释型和编译型语言 首先Python 是一门解释型语言, 计算机是不能识别高级语言的,因

Python进阶(三十五)-Fiddler命令行和HTTP断点调试

Python进阶(三十五)-Fiddler命令行和HTTP断点调试 一. Fiddler内置命令 ??上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的session不是同一个概念,这里的每条HTTP请求都称为一个session).界面中能够看到Fiddler抓取的全部HTTP请求.而为了更加方便的管理全部的session, Fiddler提供了一系列内置的函数用于筛选和操作这些session(习惯命令行操作Linux的童鞋应该能够感受到这会有多么方便

Python进阶(三十四)-Python3多线程解读

Python进阶(三十四)-Python3多线程解读 线程讲解 ??多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度. 程序的运行速度可能加快. 在一些等待的任务实现上如用户输入.文件读写和网络收发数据等,线程就比较有用了.在这种情况下我们可以释放一些珍贵的资源如内存占用等等. ??线程在执行过程中与进程还是有区别的.每个独立

Python初识与简介【第一篇】

Python初识 由于是开篇,着实有点儿小激动......此处省略一万字,虽然写博客很伤脑细胞也费时费电,但大王说了,这是牛13的开始.    其实我接触Python的一个契机是在做Nagios监控的时候,发现了Python语言的强大,也可以实现高度的自动化,所以才开始慢慢的触及它,最近看到学好Python还可以成为全栈工程师,全栈是什么,就是什么都能做,能写后端.前端.GUI.科学运算.网络编程.大数据开发等等,掌握了这个工具利器,就有能力成为一名全栈程序员,想想都牛13,故心动不已. Pyt

Python进阶(三十九)-数据可视化の使用matplotlib进行绘图分析数据

Python进阶(三十九)-数据可视化の使用matplotlib进行绘图分析数据 ??matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. ??它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序.因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定. ??在Linux下比较著名的数据图工具还有gnuplot

Python进阶(三十六)-Web框架Django项目搭建全过程

Python进阶(三十六)-Web框架Django项目搭建全过程 ??IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 ??Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! Django 特点 强大的数据库功能 用python的类继承,几行代码就可以拥有一个丰富,动态的数据库操作接口(API),如果需要你也能执行SQL语句. 自带的强大的后台功能 几行简单的代码就让你的网

初学Python(三)——字典

初学Python(三)——字典 初学Python,主要整理一些学习到的知识点,这次是字典. #-*- coding:utf-8 -*- d = {1:"name",2:"age",3:"sex"} #d[1]中的1代表的不是下标值,而是key值 print d[1] #添加值 d[4]="addres" print d #更新值 d[4]="address" print d #当key值不存在时,这个时候用

怒学Python——第三篇——结构控制

众所周知,程序语句运行的结构无非是顺序结构.分支结构和循环结构,Python也是如此,顺序结构过于简单不提,简单记录一下分支和循环与C++的异同点,顺便提一下,对于已经会C++的人来说,学Python应该注意的是语句块通过缩进来控制. 分支结构:都使用if.else,多出了一个elif代替C++的else if,本质相同,就不给出例子 循环结构:和C++对比,没有了do..until语句,有while和for,里面同样使用break来结束循环,使用continue来进入下一个循环,但for出现了