iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >第 3 章 简单函数
  • 556
分享到

第 3 章 简单函数

函数简单 2023-01-31 02:01:38 556人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

<一>数学函数在数学中我们用过sin和ln这样的函数,例如sin(π/2)=1,ln1=0等等,在C语言中也可以使用这些函数(ln函数在C标准库中叫做log):它有六种基本函数(初等基本表示):三角函数数值表(斜边为r,对边为y

<一>数学函数
在数学中我们用过sin和ln这样的函数,例如sin(π/2)=1,ln1=0等等,在C语言中也可以使用这些函数(ln函数在C标准库中叫做log):
它有六种基本函数(初等基本表示):三角函数数值表(斜边为r,对边为y,邻边为x。)   在平面直角坐标系xOy中,从点O引出一条射线OP,设旋转角为θ,设OP=r,P点的坐标为(x,y)有   
正弦函数 sinθ=y/r 正弦(sin):角α的对边 比 斜边   
余弦函数 cosθ=x/r 余弦(cos):角α的邻边 比 斜边   
正切函数 tanθ=y/x 正切(tan):角α的对边 比 邻边   
余切函数 cotθ=x/y 余切(cot):角α的邻边 比 对边   
正割函数 secθ=r/x 正割(sec):角α的斜边 比 邻边   
余割函数 cscθ=r/y 余割(csc):角α的斜边 比 对边
Sin(π/2)=y/r=1,因为y=1;r=1;
更详细了解三角函数:Http://baike.baidu.com/view/91555.htm
Log对数的概念
英语名词:logarithms。如果a^b=n,那么log(a)(n)=b。其中,a叫做“底数”,n叫做“真数”,b叫做“以a为底的n的对数”。 log(a)(n)函数叫做对数函数。对数函数中n的定义域是n>0,零和负数没有对数;a的定义域是a>0且a≠1。
详细了解log函数:http://baike.baidu.com/view/426996.htm
ln(x)是以e为底的x的对数。   
f(x)=lnx的导函数为f'(x)=1/x.   
ln(a)+ln(b)=ln(a*b)   
ln(a)-ln(b)=ln(a/b)
编写C语言中使用数学函数
#include <math.h>
#include <stdio.h>
int main()
{
 double pi =3.1416;
 printf("sin(pi/2)=%f\nln1=%f\n", sin(pi/2), log(1.0));
 return 0;
}
现在我们可以完全理解printf语句了:原来printf也是一个函数,上例中的printf("sin(pi/2)=%f\nln1=%f\n", sin(pi/2), log(1.0))是带三个参数的函数调用,而函数调用也是一种表达式,因此printf语句也是表达式语句的一种,我们调用printf不是为了得到它的返回值,而是为了利用它所产生的副作用(Side Effect)--打印。C语言的函数可以有Side Effect,这一点是它和数学函数在概念上的根本区别。
程序第一行的#号(Pound Sign,Number Sign或Hash Sign)和include表示包含一个头文件(Header File),后面尖括号(Angel Bracket)中就是文件名(这些头文件通常位于/usr/include目录下)。头文件中声明了我们程序中使用的库函数,根据先声明后使用的原则,要使用printf函数必须包含stdio.h,要使用数学函数必须包含math.h,如果什么库函数都不使用就不必包含任何头文件,例如写一个程序int main(void){int a;a=2;return 0;},不需要包含头文件就可以编译通过,当然这个程序什么也做不了。使用math.h中声明的库函数还有一点特殊之处,GCc命令行必须加-lm选项,因为数学函数位于libm.so库文件中(这些库文件通常位于/lib目录下),-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。
<二>自定义函数
main()主函数就是一个典型例子。
我们对照着main函数的定义来看语法规则:
#include <stdio.h>
int main(void)
{                                

关于main函数需要注意两点:
(1)书上的main函数定义写成main(){...}的形式,不写返回值类型也不写参数列表,这是Old Style C的风格
(2)其实操作系统在调用main函数时是传参数的,main函数最标准的形式应该是int main(int argc, char *argv[])
较简单的自定义函数

#include <stdio.h>
void newline(void)
{
 printf("\n");
}
void threeline(void)
{
 newline();
 newline();
 newline();
}
int main(void)
{
 printf("Three lines:\n");
 threeline();
 printf("Another three lines.\n");
 threeline();
 return 0;
}
通过这个简单的例子可以体会到:
1.同一个函数可以被多次调用。
2.可以用一个函数调用另一个函数,后者再去调第三个函数。
3.通过自定义函数可以给一组复杂的操作起一个简单的名字,例如threeline。对于main函数来说,只需要通过threeline这个简单的名字来调用就行了,不必知道打印三个空行具体怎么做,所有的复杂操作都被隐藏在threeline这个名字后面。
4.使用自定义函数可以使代码更简洁,main函数在任何地方想打印三个空行只需调用一个简单的threeline(),而不必每次都写三个printf("\n")。
 
执行编译时,先从主函数执行,
第一步:执行printf()函数,将字符串字面值输出,然后换行。
第二步:执行threeline()定义的函数,然后找到对应threeline()函数,执行第一个newline()函数,然后找到newline()函数,执行printf()函数输出换行。执行完以后返回threeline()函数,再执行第二个newline()函数。执行第三条语句原理是一样的。最后返回main()主函数,执行输出printf("Another three lines.\n");语句。调用第二次threeline()函数原理是一样的。执行完以后将0返回。

#include <stdio.h>
void newline(void);
void threeline(void);
int main(void)
{
 printf("Three lines:\n");
 threeline();
 printf("Another three lines.\n");
 threeline();
 return 0;
}
void newline(void)
{
 printf("?\n");
}
void threeline(void)
{
 newline();
 newline();
 newline();
}
如果注释掉声明void newline(void);和void threeline(void);,但仍然能编译通过,运行结果也对。这里涉及到的规则称为函数的隐式声明(Implicit Declaration),在main函数中调用threeline时并没有声明它,编译器认为此处隐式声明了int threeline(void);,隐式声明的函数返回值类型都是int,由于我们调用这个函数时没有传任何参数,所以编译器认为这个隐式声明的参数类型是void,这样函数的参数和返回值类型都确定下来了,编译器根据这些信息为函数调用生成相应的指令。然后编译器接着往下看,看到threeline函数的原型是void threeline(void),和先前的隐式声明的返回值类型不符,所以报警告。好在我们也没用到这个函数的返回值,所以执行结果仍然正确
<三>形参和实参
我们需要在函数定义中指明参数的个数和每个参数的类型,定义参数就像定义变量一样,需要为每个参数指明类型,参数的命名也要遵循标识符命名规则
#include <stdio.h>
void max(int x,int y)
{
 if(x>y)
 {
  printf("%d\n",x);
 } 
 else
 {
  printf("%d\n",y); 
 }
}
int main(void)
{
 max(3,4);
 return 0;
}
需要注意的是,定义变量时可以把相同类型的变量列在一起,而定义参数却不可以,例如下面这样的定义是错的:
void max(int x, y)
{
 if(x>y)
 {
  printf("%d\n",x);
 } 
 else
 {
  printf("%d\n",y); 
 }
}
 
记住这条基本原理:形参相当于函数中定义的变量,调用函数传递参数的过程相当于定义形参变量并且用实参的值来初始化。
#include <stdio.h>
void max(int x,int y)
{
 if(x>y)
 {
  printf("%d\n",x);
 } 
 else
 {
  printf("%d\n",y); 
 }
}
int main(void)
{
 int a=3,b=4;
 max(a,b);
 return 0;
}
1、定义一个函数increment,它的作用是把传进来的参数加1。例如:
#include <stdio.h>
void increment(int x)
{
 x = x + 1;
}
int main(void)
{
 int i = 1, j = 2;
 increment(i);
 increment(j);
 printf("%d\n",i);
 printf("%d\n",j);
 return 0;
}
我们在main函数中调用increment增加变量i和j的值,这样能奏效吗?为什么?
#include <stdio.h>
void increment(int *x)
{
        *x = *x + 1;
}
                                                                    
int main(void)
{
        int i = 1, j = 2;
        increment(&i);
        increment(&j);
        printf("%d\n",i);
        printf("%d\n",j);
        return 0;
}
2、如果在一个程序中调用了printf函数却不包含头文件,例如int main(void) { printf("\n"); },编译时会报警告:warning: incompatible implicit declaration of built-in function ‘printf’。请分析错误原因。
printf是个输出函数,声明头文件"#include <stdio.h>"的作用就是用来提供这些信息的stdio.h是C编译系统提供的一个文件名,stdio是"standard input & output"的缩写,即有关标准输入输出的信息。执行main()函数,有个输出函数,找不到系统的标准输入输出函数头文件,因此会报警告。
<4>全局变量、局部变量和作用域
我们把函数中定义的变量称为局部变量(Local Variable),由于形参相当于函数中定义的变量,所以形参也是一种局部变量。在这里“局部”有两层含义
1、一个函数中定义的变量不能被另一个函数使用。例如max中的x和y在main函数中没有定义,不能使用,同样main函数中的局部变量也不能被max函数使用。如果这样定义:
#include <stdio.h>
void max(int x,int y)
{
 if(x>y)
 {
  printf("%d\n",x);
 } 
 else
 {
  printf("%d\n",y); 
 }
}
int main(void)
{
 int a=3,b=4,x=5,y=6;
 max(a,b);
 return 0;
}
2、每次调用函数时局部变量都表示不同的存储空间。局部变量在每次函数调用时分配存储空间,在每次函数返回时释放存储空间,例如调用max(23, 59)时分配x和y两个变量的存储空间,在里面分别存上23和59,函数返回时释放它们的存储空间,下次再调用max(12, 20)时又分配x和y的存储空间,在里面分别存上12和20
全局变量和局部变量
#include <stdio.h>
int a =8,b =9;
void aa()
{
 printf("%d %d\n",a,b);
 
}
int main(void)
{
 int a= 3;
 aa();
 printf("%d %d\n",a,b); 
 return 0;
}
全局变量任何函数都可以访问,程序运行访问全局变量与书写全局变量顺序有些不同,据有前辈介绍大型项目有些Bug往往是对全局变量读写顺序不正确而引起的,找Bug困难。因此建议:虽然全局变量用起来很方便,但一定要慎用,能用函数传参代替的就不要用全局变量。在声明主函数前先声明全局变量a=8,b=9,在main()主函数定义一个a=3局部变量,在main()函数中a的参数为3,其他函数的参数都使用全局变量8,没有声明局部变量的变量,参数的值都是从全局变量定义中获取。但要注意一点:局部变量可以用类型相符的任意表达式来初始化,而全局变量只能用常量表达式(Constant Expression)初始化
 
参考《linux C编程一站式》学习总结,大部分内容来自《Linux C编程一站式》

--结束END--

本文标题: 第 3 章 简单函数

本文链接: https://www.lsjlt.com/news/186050.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 第 3 章 简单函数
    <一>数学函数在数学中我们用过sin和ln这样的函数,例如sin(π/2)=1,ln1=0等等,在C语言中也可以使用这些函数(ln函数在C标准库中叫做log):它有六种基本函数(初等基本表示):三角函数数值表(斜边为r,对边为y...
    99+
    2023-01-31
    函数 简单
  • 第3章 python 函数与文件操作
    函数    定义        1.基本结构        def func_name():            func_code        2.三种形式 无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印 有参:需要根据外部...
    99+
    2023-01-31
    函数 操作 文件
  • 第3章章节测试
     1,静态路由较之动态路由有哪2项优点? A 配置不容易出错 B 更安全,因为路由器不会通告路由 C 扩从网络时通常不会出现问题 D 没有计算开销 2,下列哪一项是对网络收敛的最佳描述? A 路由器从网络一端向另一端共享管理配置更改所需的时...
    99+
    2023-01-31
    测试 章节
  • 第一章 简单测试代码
    1.1  测试函数   下面是一个简单的函数,它接受名和姓,并返回整洁的姓名:   name_function.py def get_formatted_name(first,last): """Generate a nea...
    99+
    2023-01-31
    代码 简单 测试
  • 第3章 排列清单控制标记
    排列清单控制标记可以创建一般的列表、编号列表或加着重号列表,以及定义列表。还可以在一种列表中嵌套另外一种列表。对于概况因特网上的内容,列表特别重要。 3.1、无序号条例式清单<ul>和<li> 功能:<ul&g...
    99+
    2023-01-31
    清单 排列 标记
  • 第3章   IP寻址
    第3章   IP寻址 TCP/IP协议栈有四层:应用层、传输层、网际层、网络接口层。 TCP数据段的组件              Source port   ...
    99+
    2023-01-31
    IP
  • 第3章 处理异常
    代码有问题时,python会显示traceback,后面跟着一条错误信息。这个错误被称为异常(exception)。 格式try: 可能产生运行时错误的代码except: 错误恢复代码测试文本Man: Is this your ...
    99+
    2023-01-31
    异常
  • flask 第四章 偏函数 Local空
    1 . 偏函数 (partial) from functools import partial def func(*args,**kwargs): a=args b=kwargs return a,b ne...
    99+
    2023-01-31
    第四章 函数 flask
  • Python 学习第三部分函数——第一章
      函数是python 为了代码最大程度的重用和最小代码冗余而提供的最基本的程序结构。使用它我们可以将复杂的系统分解为可管理的部件。 函数相关语句 def...          创建一个对象并将其赋值给某一个对象 return     ...
    99+
    2023-01-30
    函数 Python
  • 资深专家深度剖析Kubernetes API Server第3章(共3章)
    在本系列的前两部分中我们介绍了API Server的总体流程,以及API对象如何存储到etcd中。在本文中我们将探讨如何扩展API资源。在一开始的时候,扩展API资源的唯一方法是扩展相关API源代码,集成为你所需的资源。或者,推动一个全新的...
    99+
    2023-06-03
  • 第1章 python 基础语法(3)
    =================目录==================1.8 字典1.9 字典练习2.0/2.1 流程控制-if条件判断 ======================================= dic={}字典是...
    99+
    2023-01-31
    语法 基础 python
  • MySQL的第一篇文章——了解数据库、简单的SQL语句
    目录 学习目标 第一章 介绍数据库 1. 数据库概述 2. MySQL概述 第二章 MySQL的使用 1. MySQL服务的启动 2. 客户端连接MySQL 2.1 命令行客户端 第三章 SQL的介绍 1. 什么是SQL 2. SQL的分类...
    99+
    2023-09-09
    数据库 mysql sql
  • 第3章 学生管理系统案例
    1.1 学生管理系统案例需求 利用集合完成对学生的增删改查四个功能 1.2 学生管理系统案例实现1.2.1 创建学生类: 1.2.1.1 案例代码九: package com.itheima; public class ...
    99+
    2023-01-31
    管理系统 案例 学生
  • [RHEL5系统管理攻略]--第3章 e
    3.2.3 提供日志式文件系统能力       在以后的章节中会讲到Linux内核会涉及到cache与buffer以提高读取磁盘的效率。但cache/buffer却会导致一些很严重的问题,尤其在RHEL非正常关机时。       在RHEL...
    99+
    2023-01-31
    攻略 系统
  • Python简单试题3
    1,水仙花数 水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身 (例如:1^3 + 5^3+ 3^3 = 153)  代码如下: 方法一: for i in range(100,1000): # 进行for循环 ...
    99+
    2023-01-31
    试题 简单 Python
  • 第四章 SpringMVC--Controller接口控制器详解(3)
    11、AbstractWizardFormController向导控制器类提供了多步骤(向导)表单的支持(如完善个人资料时分步骤填写基本信息、工作信息、学校信息等)假设现在做一个完善个人信息的功能,分三个页面展示:页面1完善基本信息;页面2...
    99+
    2023-06-03
  • 【创作赢红包】Python第3章 流程控制
    这里写目录标题 【本章导读】真值测试比较运算成员运算for循环while循环项目实训1项目实训2项目实训3项目实训4:项目实训5:项目实训6:项目实训7:项目实训8项目实训9:项目实训10:项...
    99+
    2023-09-07
    python 开发语言
  • spring mvc 3 最简单demo
    这两天再看spring mvc,想再网上找一个demo,感觉国内的demo都太复杂了。后来在国外网站上发现了一个比较简单,应该说是最简单的spring mvc的demo了,在此做个记录,给需要的人了解一下。 第一步:准备包: 日志相关包 j...
    99+
    2023-01-31
    最简单 spring mvc
  • MPLS的简单配置3
    实验环境:DynamipsGUI 2.8 实验拓扑:     实验目的:通过配置MPLS ×××,来达到192.168.1.0/24和192.168.2.0/24的内网互通 实验步骤:   R1: CE1(config)#int...
    99+
    2023-01-31
    简单 MPLS
  • 简单瞅瞅Python zip()函数
    zip()函数,其实看help(zip)即可 | Return a zip object whose .__next__() method returns a tuple where| the i-th element co...
    99+
    2023-01-31
    函数 简单 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作